2

にプロパティがありますMyclass:

public class MyClass{    
    public string FirstName {get;set;}
}

PropertyInfo文字列なしで(を使用して)を取得するにはどうすればよいGetProperty("FirstName")ですか?

今日、私はこれを使用します:

PropertyInfo propertyTitleNews = typeof(MyClass).GetProperty("FirstName");

次のような使用方法はありますか。

PropertyInfo propertyTitleNews = typeof(MyClass).GetProperty(MyClass.FirstName);

?

4

3 に答える 3

6

See here. The idea is to use Expression Trees.

public static string GetPropertyName<T, TReturn>(Expression<Func<T, TReturn>> expression)
{
    MemberExpression body = (MemberExpression)expression.Body;
    return body.Member.Name;
}

And then use it like:

var name = GetPropertyName<MyClass, string>(c => c.FirstName);

A bit cleaner solution would be if one would not required to specify so much generic parameters. And it is possible via moving MyClass generic param to util class:

public static class TypeMember<T>
{
    public static string GetPropertyName<TReturn>(Expression<Func<T, TReturn>> expression)
    {
        MemberExpression body = (MemberExpression)expression.Body;
        return body.Member.Name;
    }
}

Then usage will be cleaner:

var name = TypeMember<MyClass>.GetPropertyName(c => c.FirstName);
于 2013-11-09T22:09:10.440 に答える
3

Ivan Danilov's answer以外の別の可能性は、拡張メソッドを提供することです。

public static class PropertyInfoExtensions
{
    public static string GetPropertyName<TType, TReturnType>(
        this TType @this,
        Expression<Func<TType, TReturnType>> propertyId)
    {
        return ((MemberExpression)propertyId.Body).Member.Name;
    }
}

そして、次のように使用します。

MyClass c;
PropertyInfo propertyTitleNews = c.GetPropertyName(x => x.FirstName);

欠点はインスタンスが必要なことですが、利点はジェネリック引数を指定する必要がないことです。

于 2013-11-09T22:11:21.067 に答える
2

あなたはそれを行うことができます

var property = ExpressionExtensions.GetProperty<MyClass>(o => o.FirstName);

このヘルパーで:

public static PropertyInfo GetProperty<T>(Expression<Func<T, Object>> expression)
{
     MemberExpression body = (MemberExpression)expression.Body;
     return typeof(T).GetProperty(body.Member.Name);
}
于 2013-11-09T22:17:54.597 に答える