Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有可能重写这个复杂的扩展方法吗?_C#_Linq_Extension Methods - Fatal编程技术网

C# 有可能重写这个复杂的扩展方法吗?

C# 有可能重写这个复杂的扩展方法吗?,c#,linq,extension-methods,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 ArgumentExcepti

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

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;
}
结果是:

propertyName = "TEST"
我想将代码改写为:

string propertyName = TEST.PropertyName();
另外,我对这种方法的静态版本不感兴趣

对于那些不明白这个函数的意义的人。 在MVVM模式中,您已经更改了属性的通知。 像这样

this.RaisePropertyChanged("TEST");
这是一种糟糕的方法,因为属性名称是硬编码的。 借助扩展方法,您将拥有以下功能:

this.RaisePropertyChanged(()=>Test);
我想将扩展方法重写为:

this.RaisePropertyChanged(Test.PropertyName());
下面是我的MVVM项目的代码示例。(这是一个模型属性)


不,这是不可能的。局部变量名仅用于编译器,不记录,也可以在编译期间重命名

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


不过,我看不出有什么办法可以实现这一点。即使这样,它也会比您的工作()=>PropertyName类调用更大的性能杀手。

请阅读问题。“TEST.PropertyName();”它返回属性的名称。这在MVVM模式中很有用。不,在MVVM中,您想知道属性的名称,而不是局部变量的名称。这两件事完全不同。请将完整的代码显示给我们,您想在哪里使用它。当您使用反射时,当您使用obj.GetType().GetProperty(“PropertyName”)时,您可能需要此函数
this.RaisePropertyChanged(Test.PropertyName());
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");
        }
    }
}