2017-08-07 2 views
0

je le code suivant:Comment faire le type d'expression lamba le type de classe dérivée d'une classe de base générique

public abstract class EntityMapperBase<T> 
{ 
    protected void Map(string columnName, Func<EntityMapperBase<T>, object> func) 
    { 
     _mappings.Add(columnName, func); 
    } 

    protected object GetValueForColumn(string columnName) 
    { 
     return _mapping[columnName](this); 
    } 
} 

public class PersonMap: EntityMapperBase<PersonMap> 
{ 
    public string Name { get; set; } 

    public PersonMap() 
    { 
     Map(x => ((PersonMap)x).Name);   
    } 
} 

Je ne voudrais idéalement pas avoir à jeter x à la classe PersonMap.

Comment puis-je y parvenir?

+12

Supposons que 'T' est' chaîne'. Vous acceptez un 'Func '. Pourquoi voudriez-vous être capable d'appeler cela en passant dans un 'Base '? Peut-être que votre paramètre devrait être 'Func , objet>'? Qu'essayez-vous d'accomplir? C'est un peu un problème X-Y en ce moment. –

+0

J'essaie d'accéder aux propriétés de la classe dérivée dans la fonction. Comme 'Test (x => x.Name)'. x va être 'Base ' et ensuite besoin de lancer x en T, en essayant d'empêcher cela. – adriaanp

+0

Peut-être que votre méthode doit aussi être générique? Malheureusement, comme je l'ai déjà dit, vous ne nous avez pas dit ce que vous essayez de faire, alors nous ne pouvons pas vraiment vous aider. –

Répondre

2

Ce que vous cherchez est probablement ceci:

public abstract class Base<T> 
{ 
    public void Test(Func<Base<T>, object> func) 
    { 
     func(this); 
    } 
} 

Ou si vous utilisez T comme une propriété à l'intérieur de votre objet Base:

public abstract class Base<T> 
{ 
    public T MyAwesomeProperty { get; private set; } 

    public void Test(Func<T, object> func) 
    { 
     func(MyAwesomeProperty); 
    } 
} 

T = Base<T>

Pourquoi utiliser génériques? Vous pouvez ajouter des fonctions sans le type et faire la même chose que vous essayez de faire.

public abstract class EntityMapperBase 
{ 
    protected void Map(string columnName, Func<object> func) 
    { 
     _mappings.Add(columnName, func); 
    } 

    protected object GetValueForColumn(string columnName) 
    { 
     return _mapping[columnName](); 
    } 
} 

public class PersonMap: EntityMapperBase 
{ 
    public string Name { get; set; } 

    public PersonMap() 
    { 
     Map(() => this.Name);   
    } 
} 
+0

J'espère avoir clarifié la question. – adriaanp

+0

a ajouté une autre réponse! – Arcturus

+0

* facepalm * vous avez raison. – adriaanp