2

我有以下代码:

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

Visual Studio 说:

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

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

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

4

1 回答 1

3

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

注意定义中的“out”关键字IEntityFilter<out T>

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
{ }
于 2013-01-24T20:29:58.253 回答