这个问题的主要问题是,当我们将T传递给某个函数并使用它来像下面的语句一样投射一些对象时。如何将一些对象转换为T的父类的泛型类?
void SomeFunction<T> (object model)
{
(SomeClass<T>)model;
}
一切工作正常。但是我想将模型对象转换为T的父类或T的祖父的泛型类对象,这取决于不为空的东西。怎么做?
更新#1
更多了解,请看看下面的例子。
public partial class SimpleUserInfo
{
public string LogOnName { get;set; }
public string HashedPassword { get;set; }
}
public partial class UserInfo : SimpleUserInfo
{
pubic string Address { get;set; }
}
我创建了一些数据模型后。我创建了一些使用UserInfo类作为参数的泛型类。
public class SimpleUserInfoValidator : IValidator<SimpleUserInfo>
{
// logic to validate simple user info instance
}
然后,我将属性添加到SimpleUserInfo类。
[Validator(typeof(SimpleUserInfoValidator))]
public partial class SimpleUserInfo {}
最后,我创造了一些功能,在给定的T级检索验证
public GetValidator<T>()
{
var attribute = (ValidatorAttribute)Attribute.GetCustomAttribute(type, typeof(ValidatorAttribute));
if (attribute == null || attribute.ValidatorType == null)
return null;
var (IValidator<T>)Activator.CreateInstance(attribute.ValidatorType);
}
,此功能将正常工作当T SimpleUserInfo但是当T的UserInfo会出现问题。如何解决这个问题?
PS。解决这个问题并不需要使用C#4.0的新特性。但我只是告诉你,我将在C#4.0中应用此解决方案。
感谢,
你说有问题发生,但你没有说出什么问题。如果你传入UserInfo for T,那么你期望发生什么?你还没有为UserInfo定义一个验证器,所以这应该返回null。不是吗?有什么问题? – 2009-12-14 15:43:42
我认为这个问题与协变有关 - 'GetCustomAttribute'为'UserInfo'返回一个'IValidator'实例,因为**基类**被标记了该属性。因此,'GetValidator '会抛出'InvalidCastException',因为泛型类型参数不一样。 –
Groo
2009-12-14 16:10:31
我明白你的观点。在这种情况下,你会想*反变换*,而不是*协变*。 – 2009-12-14 16:26:34