2010-12-13 10 views
2

Ich habe die folgende KlassenhierarchieErweiterung Methode für stark typisierte Eigenschaft Zugang

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

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

ich kann nicht die Test-Klasse ändern. Ich möchte wie das folgende Erweiterungsmethode schreiben:

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

Um es auf folgende Weise zu verwenden:

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

Aber jetzt sagt Compiler

Die Art Argumente für die Methode 'ConsoleApplication1.TestExtensions.Property (ConsoleApplication1.Test, System.Linq.Expressions.Expression>)' kann nicht aus der Verwendung abgeleitet werden. Versuchen Sie, die Typargumente explizit anzugeben.

Ich möchte etwas wie mvc Html.TextBoxFor (x => x.Name) -Methode haben. Ist es möglich, die zu verwendende Erweiterung zu schreiben, wie in der Methode Main gezeigt?

Antwort

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

Der Compiler sollte das erste Argument ableiten können ...

+0

Ich verpasste dies beim ersten Mal :( – poindexter12

+0

Auch ich glaube nicht, dass property.ToString() das Richtige ist mach es dort. – poindexter12

5

Sie müssen die allgemeinen Argumente für den Aufruf angeben, das ist alles:

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

EDIT:

Meine Schuld. Ich vermisste das eigentliche Problem:

Dies sollte es so machen, dass Sie die generischen Argumente weglassen können. Ich nehme an, dass Sie in dieser Methode auch echten Code verarbeiten, um den Namen der Eigenschaft zu erhalten? Wenn nicht, können Sie tatsächlich diese wollen:

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

das der Fall ist. Ist es möglich, sie wegzulassen? Wie asp.net mvc Erweiterungsmethoden Html.TextBoxFor? – Sly

+0

arg +1 gleiche Sache, die ich gerade schrieb :) – leppie

+0

Danke, toString war nur um zu beginnen :) – Sly