如何让兰巴表达式类型是派生类的类型,从一个普通的基类
问题描述:
我有以下代码:如何让兰巴表达式类型是派生类的类型,从一个普通的基类
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);
}
}
我非常不希望有投x
到PersonMap
类。
我该如何做到这一点?
答
你所寻找的可能是这样的:
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);
}
}
假设'T'是'string'。你正在接受一个'Func'。你为什么期望能够通过传递一个“基地”来调用?也许你的参数应该是'Func ,object>'?你想达到什么目的?这是目前的X-Y问题。 –
我试图访问函数中派生类的属性。像'Test(x => x.Name)'。 x将会是'Base',然后需要将x投射到T,试图阻止这种情况发生。 –
adriaanp
也许你的方法也需要通用?不幸的是,正如我之前所说,你没有告诉我们你实际上想要达到什么目标,所以我们无法真正帮助你。 –