web-dev-qa-db-ja.com

クラスプロパティの名前を取得する方法

とにかく、クラスプロパティ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
_

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

私が探しているものは、アヒルのタイピングに似ていると思います。

ありがとう!

更新しました:

これが実際のコードです。これはワークフローのようなものです。ただし、各タスクはクラスのプロパティとして定義されます(クラスはタスクのグループ化に使用されます)。

_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."
                );
        }
    }
}
_

したがって、コードはクラスとプロパティの完全な名前を次のように取得して、_namespace.ApplicationTask.SendIncompleteNotification_としてデータベースに保存できます。その後、コードは文字列を読み取り、タスクを動的に作成し、別のタスクに渡して実行します。

22
Jeff

ClassName.IntPropertyの結果は単なる整数値です。それが実行されて結果が返されるとすぐに、IntPropertyから来たという痕跡はありません。

.NET 3.5を使用している場合は、代わりに式ツリーを使用できます。通常はラムダ式を介して作成されます。

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

次に、式andをコンパイルして実行し、それが何をしているかを個別に調べます(この場合はIntPropertyを取得します)。これがあなたのやりたいことに適しているかどうかはよくわかりません。

doプロパティ名をデータベースに保存する方法を考え出した場合、GetPropertyは検索の最前線に行く方法です。

おそらく、これをどのように使用したいかという点で、質問の中でより多くのコンテキストを提供できれば、私たちはより多くのことを助けることができます。単なる表現を示しましたが、それをどこで使用するかという観点で示すことができれば、それはすばらしいことです。

編集:あなたはプロパティを拡張しましたが、それがどのように呼び出されているかではありません。 Type.GetPropertiesを使用してプロパティのリストを取得し、データベースにプロパティ名のリストを保存するだけでなく、直接呼び出すには必要ですか?

繰り返しになりますが、callsプロパティと、データベースとの対話方法を示すコードを表示できれば、さらに進歩する可能性があります。

8
Jon Skeet

C#6.0では、次の方法で取得できます。

nameof(ClassName.IntProperty)
47
Ajay Bhasy

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

プロパティをループしてその名前を抽出できます。

foreach (PropertyInfo p in typeof(ClassName).GetProperties())
{
    string propertyName = p.Name;
    //....
}
29
CMS
Type objectType = this.GetType();
PropertyInfo property = objectType.GetProperty("intProperty");
System.Console.Write(property.Name);

これが必要ですか?

5
DavyR