Как получить имя свойства класса? - PullRequest
19 голосов
/ 23 марта 2009

Могу ли я в любом случае получить название класса свойства 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, и сохранить их в базе данных. Позже код будет читать строку и динамически создавать задачу и передавать ее в другую для выполнения.

Ответы [ 5 ]

32 голосов
/ 14 октября 2016

С C # 6.0 вы можете получить его по

nameof(ClassName.IntProperty)
25 голосов
/ 23 марта 2009

Я думаю, что использование метода GetProperty в этом случае является избыточным, потому что вам нужно знать имя свойства для вызова метода.

Вы можете просмотреть свои свойства и извлечь его имя:

foreach (PropertyInfo p in typeof(ClassName).GetProperties())
{
    string propertyName = p.Name;
    //....
}
8 голосов
/ 23 марта 2009

Результат ClassName.IntProperty является просто целочисленным значением. Как только он будет выполнен и результат будет возвращен, от IntProperty.

не останется никаких следов.

Если вы используете .NET 3.5, вы можете вместо этого использовать дерево выражений, обычно создаваемое с помощью лямбда-выражения:

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

Затем вы можете скомпилировать и выполнить выражения и , чтобы отдельно выяснить, что они делают (в этом случае получая IntProperty). Я не совсем уверен, подходит ли это для того, что вы хотите сделать, хотя.

Если вы делаете , как сохранить имя свойства в базе данных, тогда GetProperty - это путь к поиску.

Возможно, если бы вы могли дать больше контекста в вопросе с точки зрения того, как вы хотите использовать это, мы могли бы помочь больше. Вы показали только выражение - если бы вы могли показать его с точки зрения того, где вы будете его использовать, это было бы здорово.

РЕДАКТИРОВАТЬ: Вы расширили свойство, но не как это называется. Вам нужно , чтобы вызывать его напрямую, а не просто извлекать список свойств с помощью Type.GetProperties и сохранять список имен свойств в базе данных?

Опять же, если бы вы могли показать код, который вызывает свойство, и то, как вы хотите, чтобы он взаимодействовал с базой данных, мы сможем добиться большего прогресса.

4 голосов
/ 23 марта 2009
Type objectType = this.GetType();
PropertyInfo property = objectType.GetProperty("intProperty");
System.Console.Write(property.Name);

Это то, что тебе нужно?

0 голосов
/ 30 мая 2011

Я сталкивался с этим, и это кажется очень полезным для получения имени свойства. (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

...