如何使Lamba表达式中的Type成为通用基类

时间:2017-08-07 07:26:15

标签: c# generics contravariance

我有以下代码:

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类。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

您正在寻找的可能是:

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

或者如果您在Base对象中使用T作为属性:

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