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");
}
}
}