2009-03-23 5 views
13

とにかくクラスプロパティの名前を得ることができますIntPropertyクラスプロパティの名前を取得するには?

public class ClassName 
{ 
    public static int IntProperty { get { return 0; } } 
} 

//something like below but I want to get the string of "IntProperty" 
ClassName.IntProperty.GetType().Name 

は基本的に私が何をしたいのか、動的にデータベースにプロパティ名の文字列を保存し、後で上のデータベースから取得し、プロパティを動的に呼び出すことがあります。

私が探しているものは、ダックタイピングと似ていると思います。

ありがとうございます!

更新:

これは実際のコードです。これはワークフローのようなものです。しかし、各タスクはクラスのプロパティとして定義されます(クラスはタスクをグループ化するために使用されます)。 namespace.ApplicationTask.SendIncompleteNotificationとデータベースにこれを保存します。

public class ApplicationTask 
{ 
    public static Task<string> SendIncompleteNotification 
    { 
     get 
     { 
      return new Task<string> 
       (
       a => Console.WriteLine("Sample Task") 
       , "This is a sample task which does nothing." 
       ); 
     } 
    } 
} 

ので、コードは次のようにクラスとプロパティ何かの完全な名前を取得することができるようになります。後で、コードは文字列を読み取り、動的にタスクを作成し、別のタスクに渡して実行します。

+0

によってそれを得ることができます。http://stackoverflow.com/questions/579963/can-i- get-specific-funct-objectからのメタデータ http://stackoverflow.com/questions/301809/workarounds-for-nameof-operator-in-c-typesafe-databinding – nawfal

+0

[メソッド名の取得ラムダ式を使って入力してください](http://stackoverflow.com/questions/273941/g et-method-name-and-type-using-lambda-expression) – nawfal

答えて

8

ClassName.IntPropertyの結果がちょうど整数値です:あなたはあなたの特性をループ可能性があり、その名を抽出

。実行されて結果が返されるとすぐに、IntPropertyからの痕跡はありません。

あなたは通常、ラムダ式を経て作成され、代わりに式ツリーを使用することができます.NET 3.5を使用している場合:

Expression<Func<int>> exp =() => ClassName.IntProperty; 

あなたはその式をコンパイルし、実行することができ、別途、それは何を見つけます(この場合はIntPropertyを検索する)。これがあなたがやりたいことに適しているかどうかは分かりません。

の場合はデータベースにプロパティ名を保存する方法を理解していますが、GetPropertyは検索の前に行く方法です。

あなたがこれをどのように使いたいかという点で、より多くの文脈を与えることができれば、もっと助けてくれるかもしれません。あなたはちょうど表現を示しました。もしあなたがどこでそれを使っているかという点でそれを示すことができれば、それは素晴らしいでしょう。

編集:プロパティを拡張しましたが、呼び出される方法は変更されません。 Type.GetPropertiesを使用してプロパティリストを取得し、プロパティ名のリストをデータベースに格納するのではなく、が必要ですか?

またというコードを表示して、というプロパティと、データベースとのやりとりを行うコードを表示できれば、さらに進歩を遂げる可能性があります。

+0

ここでの議論(および他の場所)も参照してください:http://stackoverflow.com/questions/671968/retrieving-property-name-from-lambda-expression/ –

3
Type objectType = this.GetType(); 
PropertyInfo property = objectType.GetProperty("intProperty"); 
System.Console.Write(property.Name); 

これは必要なのですか?

+0

申し訳ありませんが、私が欲しいものではありません。私はそれをより明確にするために投稿を編集しました。 – Jeff

+0

"intProperty"の名前を変更する場合はどうなりますか?これを変更することを忘れないでください。 Imhoあなたのコードベースにこれらの魔法の文字列を広めるのは悪い習慣です。 wintersoliderが指摘しているように、nameof(ClassName.IntProperty)のようなものを使うことを強くお勧めします。 – Alan

20

この場合、GetPropertyメソッドの使用は、メソッドを呼び出すためにプロパティ名を知る必要があるため、重複していると思います。

foreach (PropertyInfo p in typeof(ClassName).GetProperties()) 
{ 
    string propertyName = p.Name; 
    //.... 
} 
-3

私はこれを見つけたので、プロパティ名を取得するのに非常に役立つようです。 (C++)

#define getVarName(varName,holder) sprintf(holder, "%s", #varName) 

int main() { 
    int var = 100; // just any type of identifier 
    char name[100]; // it will get the variables name 
    getVarName(var, name); 
    puts(name); 
    return 0; 
} 

REF:http://zobayer.blogspot.com/2010/05/c-fun-get-variables-name.html

+0

質問は明示的にC#を述べました。 C++はC#に簡単に変換できない場合があるので、コード変換を投稿することをお勧めします。 – jamesdeath123

20

C#6.0を使用すると、関連

nameof(ClassName.IntProperty) 
+0

これは私が探していたものです。 INotifyPropertyChangedを実装するクラスの特定のプロパティに選択的にバインドする唯一の方法です – Assimilater

関連する問題