[c#] 我如何通過反射獲取字符串屬性的值?


Answers

我無法重現這個問題。 你確定你沒有試圖做一些與索引器屬性的對象? 在這種情況下,遇到的錯誤將在處理Item屬性時拋出。 另外,你可以這樣做:


public static T GetPropertyValue<T>(object o, string propertyName)
{
      return (T)o.GetType().GetProperty(propertyName).GetValue(o, null);
}

...somewhere else in your code...
GetPropertyValue<string>(f, "Bar");
Question
public class Foo
{
   public string Bar {get; set;}
}

如何通過反射來獲取Bar,一個字符串屬性的值? 如果PropertyInfo類型是System.String,則以下代碼將引發異常

Foo f = new Foo();
f.Bar = "Jon Skeet is god.";

foreach(var property in f.GetType().GetProperties())
{
 object o = property.GetValue(f,null); //throws exception TargetParameterCountException for String type
}

看來我的問題是,該屬性是一個索引器類型,與一個System.String。

另外,我怎麼知道該屬性是一個索引器?




PropertyInfo propInfo = f.GetType().GetProperty("Bar");
object[] obRetVal = new Object[0];
string bar = propInfo.GetValue(f,obRetVal) as string;



Foo f = new Foo();
f.Bar = "x";

string value = (string)f.GetType().GetProperty("Bar").GetValue(f, null);



它很容易通過使用擴展方法獲得任何對象的屬性值,如:

public static class Helper
    {
        public static object GetPropertyValue(this object T, string PropName)
        {
            return T.GetType().GetProperty(PropName) == null ? null : T.GetType().GetProperty(PropName).GetValue(T, null);
        }
    }

用法是:

Foo f = new Foo();
f.Bar = "x";
var balbal = f.GetPropertyValue("Bar");





Links