2017-08-07 46 views
0

我有以下代碼:如何讓蘭巴表達式類型是派生類的類型,從一個普通的基類

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

我非常不希望有投xPersonMap類。

我該如何做到這一點?

+12

假設'T'是'string'。你正在接受一個'Func '。你爲什麼期望能夠通過傳遞一個「基地」來調用?也許你的參數應該是'Func ,object>'?你想達到什麼目的?這是目前的X-Y問題。 –

+0

我試圖訪問函數中派生類的屬性。像'Test(x => x.Name)'。 x將會是'Base ',然後需要將x投射到T,試圖阻止這種情況發生。 – adriaanp

+0

也許你的方法也需要通用?不幸的是,正如我之前所說,你沒有告訴我們你實際上想要達到什麼目標,所以我們無法真正幫助你。 –

回答

2

你所尋找的可能是這樣的:

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

或者,如果你使用T作爲一個屬性您Base對象中:

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

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

T = Base<T>

爲什麼要使用仿製藥?你可以添加沒有類型的功能,並且做同樣的操作。

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

相關問題