[英]How can I add this method as an extension method to properties of my class?
我有一個方法,我想將此方法作為擴展方法添加到我的類的屬性。 此方法將表達式作為輸入參數。 方法如下:
public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression)
{
return (propertyExpression.Body as MemberExpression).Member.Name;
}
我想像下面的例子一樣使用這個方法:
string propertyName = MyClass.Property1.GetPropertyName();
可能嗎? 如果是的話,解決方案是什么?
不,這是不可能的。 目前尚不清楚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;
}
}
擴展方法是特定於類型的(即使它們是通用的),如果沒有相同的擴展方法可用於該類型的所有項,則不能擁有屬性的擴展方法。
如果您有特定類型的擴展方法,則無論它是屬性還是本地變量或類成員都無關緊要,擴展方法仍然可用。
您無法創建“靜態”擴展方法。
擴展方法是“實例”方法。
你可以提供一個幫助類: -
string propertyName = PropertyHelper.GetPropertyName(() => instanceOfMyClass.Property1);
我顯然不是像喬恩這樣的專家,但在我看來,你想要什么並且相當簡單(這就是為什么我懷疑,因為喬恩顯然是一個參考人!;-)):
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
}
從我所看到的,它編譯並滿足要求。 您可能應該自己找到它,因為您從一開始就談到了擴展方法...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.