2011-08-30 32 views
2

在C#中,如何使用反射來獲取沒有getter/setters的變量?例如,下面的getValue方法適用於d2,但不適用於d1。C#獲取反射域

public class Foo { 

    public String d1; 
    public String d2 { get; set; } 

    public object getValue(String propertyName){ 
     return this.GetType().GetProperty(propertyName).GetValue(this, null); 
    } 
} 
+7

如果他們沒有getter或setters,他們不是屬性。他們是田野。他們不是一回事。 –

回答

9

d1不是房地產。這是一個領域。相反,使用字段的反射方法。

public class Foo { 

    public String d1; 
    public String d2 { get; set; } 

    public object getValue(String propertyName){ 
     var member = this.GetType().GetMember(propertyName).Single(); 
     if (member is PropertyInfo) 
     { 
      return ((PropertyInfo)member).GetValue(this, null); 
     } 
     else if (member is FieldInfo) 
     { 
      return ((FieldInfo)member).GetValue(this); 
     } 
     else throw new ArgumentOutOfRangeException(); 
    } 
} 
+0

您使用的'GetMember'的[overload](http://msdn.microsoft.com/zh-cn/library/xdtchs6z.aspx)不會返回集合,所以'Single'不是必需的。 – vcsjones

+0

@vcsjones:其實它返回一個數組(看你提供的鏈接),所以它是必要的。可能有多個成員(特別是方法)具有相同的名稱。因此,雖然它違反了命名約定,但GetMember仍然需要返回一個集合。 – StriplingWarrior

+1

Gha。我甚至與我自己的死亡聯繫在一起。閱讀失敗。我錯誤地認爲它相當於'GetProperty'(它不返回一個數組)和'GetProperties'(它確實)。 – vcsjones

4

d1不是房地產。這是一個領域。您將使用this.GetType().GetField通過反射來檢索它。

public object getFieldValue(String fieldName){ 
    return this.GetType().GetField(fieldName).GetValue(this); 
} 

什麼你可能想的是使的getValue返回屬性字段的值。你可以使用GetMember可以告訴你它是一個屬性還是一個字段。例如:

public object getValue(String memberName) { 
    var member = this.GetType().GetMember(memberName).Single(); 
    if (member.MemberType == MemberTypes.Property) { 
     return ((PropertyInfo)member).GetValue(this, null); 
    } 
    if (member.MemberType == MemberTypes.Field) { 
     return ((FieldInfo)member).GetValue(this); 
    } 
    else 
    { 
     throw new Exception("Bad member type."); 
    } 
}