C# 为什么要从某个类中进行铸造<;T>;其中T:基类到某个类<;DerivedClass:BaseClass>;不可能吗?

C# 为什么要从某个类中进行铸造<;T>;其中T:基类到某个类<;DerivedClass:BaseClass>;不可能吗?,c#,oop,generics,inheritance,covariance,C#,Oop,Generics,Inheritance,Covariance,我正在尝试创建一个泛型方法,该方法返回IRowMapper的实例。以下是我的课程: public abstract class Person { public int Id { get; set; } protected void Person() { } protected void Person(int id) { Id = id; } } public class Employer : Person { public i

我正在尝试创建一个泛型方法,该方法返回
IRowMapper
的实例。以下是我的课程:

public abstract class Person
{
    public int Id { get; set; }

    protected void Person() { }

    protected void Person(int id)
    {
        Id = id;
    }
}

public class Employer : Person
{
    public int EmployeeId { get; set; }

    public void Employer() { }

    public void Employer(int id, int employeeId) : base(id)
    {
        EmployeeId = employeeId;
    }
}

public class Employee : Person
{
    public int EmployerId { get; set; }

    public void Employee() { }

    public void Employee(int id, int employerId) : base(id)
    {
        EmployerId = employerId;
    }
}

public static class MapBuilder<TResult> where TResult : new()
{
    // ...
}

public interface IRowMapper<TResult>
{
    TResult MapRow(IDataRecord row);
}
公共抽象类人物
{
公共int Id{get;set;}
受保护的void Person(){}
受保护的无效人员(内部id)
{
Id=Id;
}
}
公共类雇主:人
{
public int EmployeeId{get;set;}
公共无效雇主(){}
公共无效雇主(内部id,内部雇员id):基础(id)
{
EmployeeId=EmployeeId;
}
}
公共类员工:人
{
public int EmployerId{get;set;}
public void Employee(){}
public void Employee(int-id,int-employerId):基(id)
{
EmployerId=EmployerId;
}
}
公共静态类MapBuilder,其中TResult:new()
{
// ...
}
公共接口IRowMapper
{
TResult MapRow(IDataRecord row);
}
现在我想做的事情如下:

private IRowMapper<T> GetRowMapper<T>() where T : Person, new()
{
    var rowMapper = MapBuilder<T>.MapNoProperties()
                                    .Map(c => c.Id).ToColumn("ID");

    if (typeof (T) == typeof (Employee))
    {
        rowMapper =
            ((MapBuilder<Employee>) rowMapper).Map(c => c.EmployerId)
                                                .ToColumn("EmployerID");
    }
    else if (typeof (T) == typeof (Employer))
    {
        rowMapper =
            ((MapBuilder<Employer>) rowMapper).Map(c => c.EmployeeId)
                                                .ToColumn("EmployeeId");
    }

    return rowMapper.Build();
}
private IRowMapper GetRowMapper(),其中T:Person,new()
{
var rowMapper=MapBuilder.MapNoProperties()
.Map(c=>c.Id).ToColumn(“Id”);
if(类型(T)=类型(员工))
{
行映射器=
((MapBuilder)rowMapper.Map(c=>c.EmployerId)
.ToColumn(“雇员ID”);
}
否则,如果(类型(T)=类型(雇主))
{
行映射器=
((MapBuilder)rowMapper.Map(c=>c.EmployeeId)
.ToColumn(“员工ID”);
}
返回rowMapper.Build();
}
但我得到了以下错误:

错误2无法转换类型 “Microsoft.Practices.EnterpriseLibrary.Data.IMapBuilderContext”到 “Microsoft.Practices.EnterpriseLibrary.Data.MapBuilder”

错误2无法转换类型 “Microsoft.Practices.EnterpriseLibrary.Data.IMapBuilderContext”到 “Microsoft.Practices.EnterpriseLibrary.Data.MapBuilder”


为什么强制转换不可能?

我对这个库不太熟悉,但看起来每个方法的返回值都是一个
IMapBuilderContext
,并且是以典型的流畅风格编写的

我认为这可能对你有用:

private IRowMapper<T> GetRowMapper<T>() where T : Person, new()
{
    var rowMapper = MapBuilder<T>.MapNoProperties()
                                 .Map(c => c.Id).ToColumn("ID");

    if (typeof (T) == typeof (Employee))
    {
        rowMapper = ((IMapBuilderContextMap<Employee>)rowMapper)
            .Map(c => c.EmployerId).ToColumn("EmployerID");
    }
    else if (typeof (T) == typeof (Employer))
    {
        rowMapper = ((IMapBuilderContextMap<Employer>)rowMapper)
            .Map(c => c.EmployeeId).ToColumn("EmployeeId");
    }

    return rowMapper.Build();
}
private IRowMapper GetRowMapper(),其中T:Person,new()
{
var rowMapper=MapBuilder.MapNoProperties()
.Map(c=>c.Id).ToColumn(“Id”);
if(类型(T)=类型(员工))
{
行映射器=((IMapBuilderContextMap)行映射器)
.Map(c=>c.EmployerId).ToColumn(“EmployerId”);
}
否则,如果(类型(T)=类型(雇主))
{
行映射器=((IMapBuilderContextMap)行映射器)
.Map(c=>c.EmployeeId).ToColumn(“EmployeeId”);
}
返回rowMapper.Build();
}

我对这个库不太熟悉,但看起来每个方法的返回值都是
IMapBuilderContext
,并且是以典型的流畅风格编写的

我认为这可能对你有用:

private IRowMapper<T> GetRowMapper<T>() where T : Person, new()
{
    var rowMapper = MapBuilder<T>.MapNoProperties()
                                 .Map(c => c.Id).ToColumn("ID");

    if (typeof (T) == typeof (Employee))
    {
        rowMapper = ((IMapBuilderContextMap<Employee>)rowMapper)
            .Map(c => c.EmployerId).ToColumn("EmployerID");
    }
    else if (typeof (T) == typeof (Employer))
    {
        rowMapper = ((IMapBuilderContextMap<Employer>)rowMapper)
            .Map(c => c.EmployeeId).ToColumn("EmployeeId");
    }

    return rowMapper.Build();
}
private IRowMapper GetRowMapper(),其中T:Person,new()
{
var rowMapper=MapBuilder.MapNoProperties()
.Map(c=>c.Id).ToColumn(“Id”);
if(类型(T)=类型(员工))
{
行映射器=((IMapBuilderContextMap)行映射器)
.Map(c=>c.EmployerId).ToColumn(“EmployerId”);
}
否则,如果(类型(T)=类型(雇主))
{
行映射器=((IMapBuilderContextMap)行映射器)
.Map(c=>c.EmployeeId).ToColumn(“EmployeeId”);
}
返回rowMapper.Build();
}

“通用”表示相同的代码适用于所有类型。对于有限数量的类型具有不同的代码路径表示设计中存在问题。你想达到什么目的?@dtb,你说得对,用这样的东西并不聪明。谢谢你的提醒。“泛型”意味着相同的代码适用于所有类型。对于有限数量的类型具有不同的代码路径表示设计中存在问题。你想达到什么目的?@dtb,你说得对,用这样的东西并不聪明。谢谢你的提醒。我还没试过,但我相信它会管用的。即使在复制错误代码时,我也看不到它。谢谢!我还没试过,但我相信它会奏效的。即使在复制错误代码时,我也看不到它。谢谢!