我有一个通用类,它公开与基类类型和子类类型相同的对象,如下所示:
void Main()
{
var genericTest = new GenericTestClass<ChildClass>(new ChildClass());
var baseVal = genericTest.Entity.ValBase;
var castBaseVal = genericTest.EntityCast.ValBase;
var castBaseChildVal = genericTest.EntityCast.Val;
//var wontWork = genericTest.Entity.Val; //AS EXPECTED WILL NOT COMPILE
}
public class GenericTestClass<T> where T : BaseClass
{
public BaseClass Entity {get;}
public T EntityCast => Entity as T;
public GenericTestClass(T myClass)
{
Entity = myClass;
}
}
public class BaseClass
{
public int ValBase => 1;
}
public class ChildClass : BaseClass
{
public int Val => 2;
}
正如预期的那样,var wontWork = genericTest.Entity.Val
行将不会编译,我想在单元测试中验证这种不同的行为。
我的问题是如何最好地证明Entity
和EntityCast
的不同行为,以确保投射正确工作?显然,它们在检查类型时都返回ChildClass
,所以我不能使用Assert.IsType<BaseClass>(genericTest.Entity)
。
谢谢
答案 0 :(得分:0)
首先发表评论。交换属性的角色似乎更自然。
public class GenericTestClass<T> where T : BaseClass
{
public BaseClass Entity => EntityCast;
public T EntityCast { get; }
public GenericTestClass(T myClass)
{
EntityCast = myClass;
}
}
如果我对您的理解正确,那么这可能就是您想要的:
var properyEntity = typeof(GenericTestClass<>).GetProperty("Entity");
Assert.AreEqual(typeof(BaseClass), propertyEntity.PropertyType);
Assert.IsNull(typeof(BaseClass).GetProperty("Val"));
您还可以使用GenericTestClass<ChildClass>
而不是GenericTestClass<>
。
但是我不确定像这样的“测试”是否有意义。
您还可以使用这样的方法(具有可疑的价值!):
static Type GetCompiletimeTypeOf<T>(T dummy) => typeof(T);
那么您可以做:
Assert.AreEqual(GetCompiletimeTypeOf(genericTest.Entity), typeof(BaseClass));
与您问题中的var genericTest = new GenericTestClass<ChildClass>(new ChildClass());
一样。