2017-08-07 4 views
0

から派生したクラスの型であるI次のコードを持っている:私は理想的PersonMapクラスにxをキャストする必要はしたくないでしょうラムダ式の型を作るためにどのように汎用の基本クラス

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);   
    } 
} 

を。

どうすれば実現できますか? !

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

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

T = Base<T>

なぜ使用:あなたはBaseオブジェクトの内部プロパティとしてTを使用する場合

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

または:

+12

'T'が' string'であるとします。あなたは 'Func 'を受け入れています。なぜあなたは 'Base 'を渡すことでそれを呼び出すことができると思いますか?おそらく、あなたのパラメータは 'Func 、object>'でなければなりません。あなたは何を達成しようとしていますか?これは現時点ではX-Y問題のビットです。 –

+0

私は関数の派生クラスのプロパティにアクセスしようとしています。 'Test(x => x.Name)'のように。 xは 'Base 'になりますので、それを防ぐためにxをTにキャストする必要があります。 – adriaanp

+0

あなたのメソッドも汎用性が必要なのでしょうか?残念ながら、私が前に言ったように、あなたが実際に達成しようとしていることを私たちに語っていないので、本当にあなたを助けることはできません。 –

答えて

2

は何あなたが探していることは、おそらくこれですジェネリック薬?型なしで関数を追加して、同じことをすることができます。

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

うまくいけば私は質問をより明確にした。 – adriaanp

+0

が別の回答を追加しました! – Arcturus

+0

* facepalm *あなたの右。 – adriaanp

関連する問題