如何使用值类型约束在通用声明的类型之间进行复制

时间:2009-02-26 23:09:04

标签: c# .net generics casting generic-constraints

我有一个在值类型之间复制值的通用方法。即使使用struct约束,以下方法也会产生设计时错误。知道如何在值之间复制或转换吗?

private Ttgt MyMethod<Tsrc,Ttgt>(Tsrc SourceObject) 
    where Tsrc : struct
    where Ttgt : struct
{
    //Error:cannot implictly convert type 'Tsrc' to 'Ttgt'
    Ttgt returnObject = SourceObject; 

    //Error:Cannot convert type 'Tsrc' to 'Ttgt'
    Ttgt returnObject = (Ttgt)SourceObject; 

    return returnObject;
}

5 个答案:

答案 0 :(得分:3)

鉴于有一个注册类型的转换器,你试图在一点反射魔法之间进行转换可以解决这个问题:

private Ttgt MyMethod<Tsrc,Ttgt>(Tsrc sourceObject) 
    where Tsrc:struct where  Ttgt:struct    
{    
    Type targetType = typeof(Ttgt);
    TypeConverter tc = TypeDescriptor.GetConverter(targetType);
    Ttgt returnObject = (Ttgt)tc.ConvertTo(sourceObject, targetType);
    return returnObject;    
}

但开箱即用它的用途非常有限,因为例如bool和int之间没有转换器。你想解决什么问题?

我还发现了另一个question,里面有一些疯狂的转化代码。

编辑: 您的注释清楚地表明您正在尝试在域对象和某种视图/合同模型之间执行对象到对象的映射。你看过AutoMapper吗?

答案 1 :(得分:1)

  

//错误:无法将类型'Tsrc'转换为'Ttgt'

除非有可访问的转换运算符,否则无法在任意类型之间进行转换。

答案 2 :(得分:1)

这两个被定义为不同的类型。尽管它们都是结构,但它们的类型并不相同。

将源和目标定义为相同的类型:

private T MyMethod<T>(T source, T target)
{

答案 3 :(得分:0)

这是“按设计”。您试图在两个不相关的值类型之间进行转换。这将永远不会成功,因此它被标记为错误。

所有价值因素都是如此,因为它们是隐含密封的。为了在TSrc之间进行演员 - >要成功,Ttgt必须在两种类型之间存在类层次关系。这不可能是因为所有的值类型都是密封的,因此没有办法可以从另一个中获得。

唯一可行的方法是,如果在类型之间有自定义转换运算符。情况可能如此。但是,在处理泛型类型时,不会处理自定义转换运算符。

答案 4 :(得分:0)

出于此目的,Convert类存在。

private Ttgt MyMethod<Tsrc, Ttgt>(Tsrc SourceObject)
    where Tsrc : struct
    where Ttgt : struct
{
    return (Ttgt) Convert.ChangeType(SourceObject, typeof(Ttgt));
}

另请注意,可以执行此操作:

    return (Ttgt) (object) SourceObject;