C# 如何处理Type.isAssignables,避免不使用继承的接口?

C# 如何处理Type.isAssignables,避免不使用继承的接口?,c#,C#,我做了一个测试用例来说明我遇到的问题 第一个断言通过,但第二个和第三个断言都失败 是否有一种方法可以以不同的方式检查两种故障条件k中的任何一种?如果速度不太快就可以了,因为我打算在每个类型的基础上缓存结果 public interface IParentInterface { } public interface IChildInterface : IParentInterface { } public class ParentClass<T> where T: IParen

我做了一个测试用例来说明我遇到的问题

第一个断言通过,但第二个和第三个断言都失败

是否有一种方法可以以不同的方式检查两种故障条件k中的任何一种?如果速度不太快就可以了,因为我打算在每个类型的基础上缓存结果

public interface IParentInterface
{

}

public interface IChildInterface : IParentInterface
{

}

public class ParentClass<T> where T: IParentInterface
{

}

public class ChildClass : ParentClass<IChildInterface>
{

}

public class TestClass
{
    public ChildClass Property { get; set; }
}

[TestFixture]
public class ScratchPad
{

    [Test]
    public void Assignabl()
    {
        var tc = new TestClass();
        var tct = tc.GetType();

        var pi = tct.GetProperty("Property");

        Assert.IsNotNull(pi);

        Assert.IsTrue(typeof(ParentClass<IChildInterface>).IsAssignableFrom(pi.PropertyType));
        Assert.IsTrue(typeof(ParentClass<>).IsAssignableFrom(pi.PropertyType));
        Assert.IsTrue(typeof(ParentClass<IParentInterface>).IsAssignableFrom(pi.PropertyType));

    }

}
公共接口IParentInterface
{
}
公共接口IchilInterface:IParentInterface
{
}
公共类ParentClass,其中T:IParentInterface
{
}
公共类子类:父类
{
}
公共类TestClass
{
公共子类属性{get;set;}
}
[测试夹具]
公共类便笺簿
{
[测试]
公共无效转让
{
var tc=新的TestClass();
var tct=tc.GetType();
var pi=tct.GetProperty(“属性”);
Assert.IsNotNull(pi);
IsTrue(typeof(ParentClass).IsAssignableFrom(pi.PropertyType));
IsTrue(typeof(ParentClass).IsAssignableFrom(pi.PropertyType));
IsTrue(typeof(ParentClass).IsAssignableFrom(pi.PropertyType));
}
}
这不是吗


那么它只是C目前不支持的东西,但C 4.0可能会支持。

您的第二个断言是在设计上失败的。当你写作时

public class ParentClass<ParentInterface>
我怀疑在我们得到c#4.0之前,你想要的是不可能的:

Parent
不可转让给

Parent<IParent>
Parent
目前没有针对泛型的协方差/逆方差。

您不能,因为C#3.0不支持此类方差。在C#4.0中,您应该能够

使用另一个示例,假设您有一个
列表
,并且可以将其分配给一个
列表

然后尝试将其添加到
childList
中,如下所示:

childList.Add(new ParentInterface2Implementation());

你会得到一个例外,因为
childList
实际上是一个
List
并且只能存储
ParentInterface
的实现,而
ParentInterface2
不是。

我在编写测试用例时犯了一个错误,这不能代表实际情况。我对示例进行了编辑以反映这一点。C#4.0将具有带有“out”关键字的泛型的协方差。哦,好吧。我想我可以通过反思来做我需要的事情,只是感觉比我所希望的要肮脏得多。
interface IParent { }
interface IChild : IParent { }
Parent<IChild> 
Parent<IParent>
List<ParentInterface> parentList = List<ParentInterface>();
List<ChildInterface> childList = parentList;
public interface ParentInterface2 : ChildInterface {}
childList.Add(new ParentInterface2Implementation());