我有以下代码:
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方法?
答案 0 :(得分:3)
如果可以从接口派生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
{ }