簡體   English   中英

如何將此方法作為擴展方法添加到我的類的屬性中?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM