2017-08-07 45 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

相关问题