簡體   English   中英

強類型屬性訪問的擴展方法

[英]Extension method for strongly typed property access

我有以下類層次結構

class Test
{
    public string Name { get; set; }
}

class TestChild : Test
{
    public string Surname { get; set; }
}

無法改變Test類。 我想寫下面這樣的擴展方法:

static class TestExtensions
{
    public static string Property<TModel, TProperty>(this Test test, Expression<Func<TModel, TProperty>> property)
    {
        return property.ToString();
    }
}

能夠以下列方式使用它:

class Program
{
    static void Main(string[] args)
    {
        TestChild t = new TestChild();
        string s = t.Property(x => x.Name);
    }
}

但現在編譯說

無法從用法中推斷出方法“ConsoleApplication1.TestExtensions.Property(ConsoleApplication1.Test,System.Linq.Expressions.Expression>)”的類型參數。 嘗試顯式指定類型參數。

我希望有類似mvc Html.TextBoxFor(x => x.Name)方法的東西。 是否可以編寫擴展以使用Main方法中顯示的?

您需要為調用指定通用參數,即全部:

string s = t.Property<TestChild, string>(x => x.Name);

編輯:

我的錯。 我錯過了真正的問題:

public static string Property<TModel, TProperty>(this TModel model, Expression<Func<TModel, TProperty>> property)
{
    return property.ToString();
}

這應該使它可以省略泛型參數。 我假設您還在處理此方法中的實際代碼以獲取屬性名稱? 如果沒有,你可能真的想要這個:

public static string Property<TModel, TProperty>(this TModel model, Expression<Func<TModel, TProperty>> property)
{
    var memberExpression = property.Body as MemberExpression;
    return memberExpression.Member.Name;
}
static class TestExtensions
{
    public static string Property<TModel, TProperty>(this TModel test, Expression<Func<TModel, TProperty>> property)
    {
        return property.ToString();
    }
}

編譯器應該能夠推斷出第一個參數......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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