是否有可能重写这种棘手的扩展方法?

时间:2010-10-29 05:47:55

标签: c# linq extension-methods

是否可以在没有参数的情况下重写此扩展方法?

public static string PropertyName<T>(this T obj, Expression<Func<T>> property)
{
    var memberExpression = property.Body as MemberExpression;
    if (memberExpression == null)
        throw new ArgumentException("Expression must be a MemberExpression.", "property");
    return memberExpression.Member.Name;
}

这是该功能的测试代码。

string TEST = Guid.NewGuid().ToString();
string propertyName = TEST.PropertyName(() => TEST);

结果如下:

propertyName = "TEST"

我想重写代码:

string propertyName = TEST.PropertyName();

聚苯乙烯。我对这种方法的静态版本不感兴趣!

对于那些如何看不出这个功能的重点。 在MVVM模式中,您已为属性更改了通知。 像这样。

this.RaisePropertyChanged("TEST");

这是一个糟糕的方法,因为属性名称是硬编码的。 借助扩展方法,您将拥有:

this.RaisePropertyChanged(()=>Test);

我想将扩展方法重写为:

this.RaisePropertyChanged(Test.PropertyName());

以下是我的MVVM项目的代码示例。 (这是一个Model属性)

public DateTime Start
{
    get { return WorkModel.Start; }
    set
    {
        if (WorkModel.Start != value)
        {
            WorkModel.Start = new DateTime(SelectedDate.Year, SelectedDate.Month, SelectedDate.Day, value.Hour, value.Minute, value.Second);
            this.RaisePropertyChanged("Start");
            this.RaisePropertyChanged("TotalWork");
        }
    }
}

1 个答案:

答案 0 :(得分:1)

不,这是不可能的。本地变量名仅适用于编译器,不会记录或在编译期间可以重命名。

当然属性是不同的东西。你应该知道你的第一个例子与你的第二个例子不同。

尽管如此,我还没有看到你可以实现这一点的方法。即使这样,它也会比你的work()=&gt; PropertyName类型的调用具有更大的性能杀手。