gpt4 book ai didi

c# - 如何将某些对象转换为 T 的父类的泛型类?

转载 作者:行者123 更新时间:2023-11-30 21:23:13 24 4
gpt4 key购买 nike

这道题的主要问题是当我们将 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 时会出现问题。如何解决?

附言。解决这个问题不需要使用C#4.0的新特性。但我只是告诉你我将在 C# 4.0 中应用这个解决方案。

谢谢,

最佳答案

我还没有安装 .NET 4.0,所以我不确定如何正确使用协方差,但即使在 .Net 2.0 和 3.5 中,您也可以使用 Duck Typing 获得协方差支持。库(例如 duck typing library by David MeyerLinFu by Philip Laureano :

换句话说,GetValidator<T> 中的最后一行应该是这样的:

// http://www.deftflux.net/blog/page/Duck-Typing-Project.aspx
return DuckTyping.Cast<IValidator<T>>
Activator.CreateInstance(attribute.ValidatorType);

或者(使用临富)

// http://www.codeproject.com/KB/cs/LinFuPart2.aspx
DynamicObject dynamicObj = new DynamicObject
(Activator.CreateInstance(attribute.ValidatorType));
return dynamicObj.CreateDuck<IValidator<T>>()

[编辑]

可能我没有理解你的问题,但我相信归结为:

你有一个带有类型 T 的泛型参数的泛型接口(interface):

IValidator<SimpleUserInfo> simpleUserValidator;

您想将它转换为相同的通用接口(interface),但带有一个通用参数,该参数是 T 的类:

IValidator<SimpleUserInfo> ---> IValidator<UserInfo> 

简单转换将不起作用,因为不支持泛型类型协变(至少在旧版本的 .Net 中不支持):

// this will throw an invalid cast exception
IValidator<UserInfo> userValidator = (IValidator<UserInfo>) simpleUserValidator;

但它可以使用 duck typing 工作:

IValidator<UserInfo> userValidator = 
DuckTyping.Cast<IValidator<UserInfo>> (simpleUserValidator);

再一次,.Net 4.0 should handle covariance ,但我还没有测试过。此示例适用于任何 .Net 版本,因此为了完整起见,我将其包括在内。

关于c# - 如何将某些对象转换为 T 的父类的泛型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1899647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com