代码之家  ›  专栏  ›  技术社区  ›  Jon Simpson

如何在具有值类型约束的泛型声明类型之间进行复制

  •  1
  • Jon Simpson  · 技术社区  · 17 年前

    我有一个在值类型之间复制值的通用方法。以下方法给出了设计时错误,即使使用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 回复  |  直到 14 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

    考虑到有一个注册的类型转换器用于您试图在两种类型之间转换的类型,一个小小的反射魔术可以做到这一点:

    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 ?

        2
  •  1
  •   Richard    17 年前

    除非有可访问的转换运算符,否则不能在任意类型之间转换。

        3
  •  1
  •   andleer    17 年前

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

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

    private T MyMethod<T>(T source, T target)
    {
    
        4
  •  0
  •   JaredPar    17 年前

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

    成功的唯一方法是在类型之间使用自定义转换运算符。可能是这样。但是,在处理泛型类型时,将不会处理自定义转换运算符。

        5
  •  0
  •   Fabrício Matté    17 年前

    这个 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;