2010-12-13 73 views
2

propriété J'ai la hiérarchie de classe suivanteméthode d'extension pour un accès fortement typé

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

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

Je ne peux pas changer la classe de test. Je veux écrire la suite méthode d'extension comme ceci:

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

Pour pouvoir l'utiliser de la manière suivante:

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

Mais maintenant compilateur dit

Les arguments de type pour la méthode 'ConsoleApplication1.TestExtensions.Property (ConsoleApplication1.Test, System.Linq.Expressions.Expression>)' ne peut pas être déduit de l'utilisation. Essayez de spécifier explicitement les arguments de type.

Je veux avoir quelque chose comme mvc Html.TextBoxFor (x => x.Name) méthode. Est-il possible d'écrire l'extension à utiliser comme indiqué dans la méthode Main?

Répondre

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

Le compilateur devrait être en mesure de déduire le premier argument ...

+0

J'ai raté ce la première fois :( – poindexter12

+0

En outre, je ne pense pas que property.ToString() est la bonne chose à faire là-bas. – poindexter12

5

Vous devez spécifier les arguments génériques pour l'appel, c'est tout:

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

EDIT:

Ma faute. J'ai raté le vrai problème:

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

Cela devrait faire en sorte que vous pouvez omettre les arguments génériques. Je suppose que vous êtes également en train de traiter le code réel dans cette méthode pour obtenir le nom de la propriété? Sinon, vous pouvez réellement vouloir ceci:

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

C'est le cas. Est-il possible de les omettre? Comme les méthodes d'extension asp.net mvc Html.TextBoxFor? – Sly

+0

arg +1 même chose que je viens d'écrire :) – leppie

+0

Merci, toString était juste pour commencer :) – Sly