2016-08-05 4 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

あなたは、変数/メソッド/プロパティを混在させています。あなたは、リフレクションでプロパティの属性を読みたいと思うと思います。 Reflection(C#)を使用して属性にアクセスする_ https://msdn.microsoft.com/en-us/library/mt653983.aspx –

+0

この質問には、「いいえ、あなたのそれをすることはできませんが、あなたの代わりにできることはここにあります」。 'CheckMethod'に渡される値は' List 'です。この値はどこから来たのか分かりません。 –

+0

リフレクションを使用してプロパティの名前を簡単に取得することはできますが、使用できるプロパティの値だけではできません。プロパティを見つけるには、プロパティの名前(またはそれを識別する他のもの)を知っていなければなりません。その場合、あなたはちょうど鶏と卵の問題でこれをラップしました。メソッドに渡される値のソースの名前を絶対に知っていなければならない場合は、1.メソッドに渡された値にその名前を作成するか(.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"の名前を取得することです。パラメータ名は、任意の "任意"にすることができます。CheckMethodでメソッドを使用すると、 "M1"または " "M2"。 –

0

あなたは文字列として任意の変数の名前を返すべきnameof(anyVariable)を使用することができます。

関連する問題