如何将此方法作为扩展方法添加到我的类的属性中?

时间:2011-05-18 10:03:05

标签: c# properties extension-methods expression

我有一个方法,我想将此方法作为扩展方法添加到我的类的属性。 此方法将表达式作为输入参数。方法如下:

    public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression)
    {
        return (propertyExpression.Body as MemberExpression).Member.Name;
    }

我想使用此方法,如下例所示:

string propertyName = MyClass.Property1.GetPropertyName();

有可能吗?如果是的话,解决方案是什么?

4 个答案:

答案 0 :(得分:6)

不,这样做是不可能的。不清楚MyClass是否是类的名称(并且Property1是静态属性)或者它是否是实例属性而MyClass.Property1根本不是有效的成员访问权限。如果是后者,您可能希望将方法更改为:

public static string GetPropertyName<TSource, TResult>(
    Expression<Func<TSource, TResult>> propertyExpression)
{
    return (propertyExpression.Body as MemberExpression).Member.Name;
}

并将其命名为:

string propertyName = GetPropertyName<MyClass, string>(x => x.Property1);

或者可以使用泛型类和泛型方法,以便可以推断出string

string propertyName = PropertyUtil<MyClass>.GetPropertyName(x => x.Property1);

这就像是:

public static class PropertyUtil<TSource>
{
    public static string GetPropertyName<TResult>(
        Expression<Func<TSource, TResult>> propertyExpression)
    {
       return (propertyExpression.Body as MemberExpression).Member.Name;
    }
}

答案 1 :(得分:1)

扩展方法是特定于类型的(即使它们是通用的),如果没有相同的扩展方法可用于该类型的所有项目,则不能拥有属性的扩展方法。

如果您有特定类型的扩展方法,无论它是属性还是本地变量或类成员都无关紧要,扩展方法仍然可用。

答案 2 :(得分:0)

您无法创建&#34;静态&#34;扩展方法。

扩展方法是&#34;实例&#34;方法

你可以提供一个助手类: -

string propertyName = PropertyHelper.GetPropertyName(() => instanceOfMyClass.Property1);

答案 3 :(得分:0)

我显然不是Jon这样的专家,但在我看来,你想要的却是相当简单的(这就是为什么我怀疑,因为Jon显然是一个参考人物!;-)):

class Program
{
    static void Main(string[] args)
    {
        MyClass<int> myClass = new MyClass<int>();
        string property1Name = myClass.Property1.GetPropertyName();
        string property2Name = myClass.Property2.GetPropertyName();
    }
}

public static class Extensions
{
    public static string GetPropertyName<T>(this Expression<Func<T>> propertyExpression)
    {
        return (propertyExpression.Body as MemberExpression).Member.Name;
    }
}

public class MyClass<T>
{
    public Expression<Func<T>> Property1; //Sample with MyClass being generic
    public Expression<Func<string>> Property2; //Sample which works anyway, MyClass being generic or not
}

从我所看到的,它编译并满足要求。你可能应该自己找到它,因为你从一开始就谈到了一个扩展方法......