2010-12-13 65 views
2

擴展方法我有下面的類層次結構的強類型屬性訪問

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

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

不能更改測試類。我想寫下面的擴展方法是這樣的:

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方法所示?

回答

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

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

+0

我錯過了這個第一次:( – poindexter12 2010-12-13 18:38:09

+0

此外,我不認爲該property.ToString()是正確的在那裏做。 – poindexter12 2010-12-13 18:46:19

5

你需要呼叫指定通用參數,這一切:

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; 
} 
+0

情況就是這樣。有可能省略它們嗎?像asp.net的mvc擴展方法Html.TextBoxFor? – Sly 2010-12-13 18:28:24

+0

arg +1同樣的東西,我只是寫道:) – leppie 2010-12-13 18:42:52

+0

謝謝,toString只是開始:) – Sly 2010-12-14 08:11:07