2016-08-05 22 views
2

編輯:爲了清楚地說明我的問題,我詢問了一個新的question如何使用C#中的反射區分具有相同屬性的類成員


編輯:由於反射的解決方案是不可能的,所以我從改了稱呼「?有沒有辦法讓在C#中的變量名」 「如何辨別類成員使用C#反射相同屬性」


編輯:變量名是不準確的意思,我的目標是

  • 獲取可能的話使用反射變量名(有人已經告訴我這是不可能的)。
  • 使用解決方案來獲取在任何情況下聲明成員時添加的信息,例如在CheckMethod中。

我想我可以使用反射來獲取變量信息,包括其名稱,但不起作用。

public class C 
{ 
    public List<string> M1{get; set;} 
    public List<string> M2{get; set;} 
} 

static void Main(string[] args) 
{ 
    C c = new C(); 
    CheckMethod(c.M1); 
    ChekcMethod(c.M2); 
} 

void CheckMethod(List<string> m) 
{ 
    //Want to get the name "M1" or "M2", but don't know how 
    Console.Write(m.VariableName); 
} 

然後,我想屬性可能是解決方案。

public class C 
{ 
    [DisplayName("M1")] 
    public List<string> M1{get; set;} 
    [DisplayName("M2")] 
    public List<string> M2{get; set;} 
} 

static void Main(string[] args) 
{ 
    C c = new C(); 
    CheckMethod(c.M1); 
    ChekcMethod(c.M2); 
} 

void CheckMethod(List<string> m) 
{ 
    //Find all properties with DisplayNameAttribute 
    var propertyInfos = typeof(C) 
      .GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance 
          | BindingFlags.GetField | BindingFlags.GetProperty) 
      .FindAll(pi => pi.IsDefined(typeof(DisplayNameAttribute), true)); 
    foreach (var propertyInfo in propertyInfos) 
    { 
     //I can get the DisplayName of all properties, but don't know m is M1 or M2 

    } 
} 
  • 是否有任何本地反射的方式來獲得變量的名稱?這是不可能的
  • 如何確定方法參數代表哪個成員變量?

我與Unity3D工作,所以.NET版本是3.5

+1

你在混合東西,變量/方法/屬性。我想你想用反射來讀取屬性的屬性。您可能會看看這裏:_Accessing屬性通過使用反射(C#)_ https://msdn.microsoft.com/en-us/library/mt653983.aspx –

+0

此問題將只有答案沿着「不,你不能這樣做,但這是你可以做的「。傳遞給'CheckMethod'的值是'List ',這個值不知道它來自哪裏。 –

+0

您可以使用反射輕鬆獲取屬性的名稱,但只能使用可用屬性的值才能完成此操作。要找到該房產,您必須知道房產的名稱(或其他標識該房產的名稱),在這種情況下,您已經將其包裹在雞與雞蛋問題中。如果您絕對必須知道傳遞給方法的值的源名稱,請將其名稱構建到傳遞給方法的值中(賦予它一個.Name屬性),或者2.將名稱與值一起傳遞(額外的參數) –

回答

3

使用反射,這是不可能的。編譯變量名稱不存在後,所以不能在運行時使用反射來獲取名稱。還有其他一些方法,如表達式樹和閉包。如果你可以使用它們,試試這個。

static string GetVariableName<T>(Expression<Func<T>> expr) 
{ 
    var body = (MemberExpression)expr.Body; 

    return body.Member.Name; 
} 

要使用這種功能,你可以做

GetVariableName(() => someVar) 

如果你使用的是C#6新nameof keyworkd已被添加。更多信息

https://msdn.microsoft.com/en-us/magazine/dn802602.aspx

+0

我之前嘗試過,但並不滿足我的需求。它返回在調用中輸入的變量名稱,在聲明此成員變量時我需要某種原始名稱,這就是我使用屬性解決方案的原因。 –

+0

正如有人告訴你,我認爲你正在混合一些概念。如果你想要變量名,你應該使用我在答案中寫的。 – acostela

+0

我曾嘗試過你的方法,這不是我想要的。我的目標是在CheckMethod中獲取「M1」或「M2」名稱,參數名稱可以是任意的,例如「any」,使用CheckMethod中的方法只獲取名稱「any」,而不是「M1」或「M2」。 –

0

你可以使用nameof(anyVariable)這應該作爲一個字符串返回任何變量的名稱。

相關問題