C # эквивалент typeof для полей - PullRequest
3 голосов
/ 06 мая 2010

С помощью отражения вы можете искать класс из строки во время выполнения, но вы также можете сказать typeof (Foo) и получить проверку типа во время компиляции, автозаполнение и т. Д.

Если вам нужно поле, а не класс, вы можете найти его из строки во время выполнения, но если вы хотите проверить тип времени компиляции и т. Д., Есть ли способ сказать что-то вроде fieldof (Foo.Bar)? Я заранее знаю имя класса и поля и хочу иметь возможность ссылаться на поле во время компиляции, а не при поиске строки во время выполнения.

edit: пример того, для чего я хочу это использовать, скажем, у меня есть список объектов, которые могли быть прочитаны из базы данных, и я хочу отобразить их в DataGridView, но я хочу только отображаемые столбцы для определенных полей. Я хотел бы написать метод что-то вроде:

void DisplayData(object[] objs, params FieldInfo[] fields)

и сможете назвать его как

DisplayData(accounts, fieldof(Account.Name), fieldof(Account.Email));

Такая идея.

Ответы [ 2 ]

5 голосов
/ 06 мая 2010

Вы можете избавиться от строковых литералов, используя выражения

public static PropertyInfo GetProperty<T>(Expression<Func<T, object>> expression)
{
    MemberExpression memberExpression = null;

    if (expression.Body.NodeType == ExpressionType.Convert)
    {
        memberExpression = ((UnaryExpression)expression.Body).Operand as MemberExpression;
    }
    else if (expression.Body.NodeType == ExpressionType.MemberAccess)
    {
        memberExpression = expression.Body as MemberExpression;
    }

    return memberExpression.Member as PropertyInfo;
}

// usage:
PropertyInfo p = GetProperty<MyClass>(x => x.MyCompileTimeCheckedPropertyName);
0 голосов
/ 06 мая 2010

Не для полей.Самое близкое, что вы можете получить, это «использование псевдонима», которое позволяет вам указать альтернативные имена для типов: например, используя foo = System.Collections.Generic.List;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...