将泛型对象强制转换为具有泛型类型接口的对象

本文关键字:对象 泛型类型 接口 转换 泛型 | 更新日期: 2023-09-27 17:55:57

我有以下代码:

public class EntityFilter<T>
{}
public interface IEntity
{}
public class TestEntity : IEntity
{}
class Program
{
    static void Main(string[] args)
    {   
        var ef = new EntityFilter<TestEntity>();
        DoSomething((EntityFilter<IEntity>)ef); // <- casting fails
    }
    public static void DoSomething(EntityFilter<IEntity> someEntityFilter)
    {
    }
}

视觉工作室 说:

Cannot convert type 'ConsoleApplication1.EntityFilter<ConsoleApplication1.TestEntity>' to 'ConsoleApplication1.EntityFilter<ConsoleApplication1.IEntity>'

我无法将 DoSomething 方法转换为通用方法并接受EntityFilter<T>因为在我的应用程序中,T 的类型在 DoSomething 调用时是未知的。稍后将使用反射在 DoSomething 中确定类型。

如何在不使 DoSomething 方法通用的情况下将 ef 变量传递给 DoSomething 方法?

将泛型对象强制转换为具有泛型类型接口的对象

如果可以从接口派生EntityFilter<T>并且该接口具有协变泛型参数,则可以在方法中不使用泛型来执行所要求的操作。

请注意IEntityFilter<out T>定义中的"out"关键字。

public class Program
{
    static void Main(string[] args)
    {
        var ef = new EntityFilter<TestEntity>();
        DoSomething(ef);
    }
    public static void DoSomething(IEntityFilter<IEntity> someEntityFilter)
    {
    }
}
public interface IEntityFilter<out T>
{ }
public class EntityFilter<T> : IEntityFilter<T>
{ }
public interface IEntity
{ }
public class TestEntity : IEntity
{ }