Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#.NET中的自定义助手转换器_C#_Converter_Helper - Fatal编程技术网

C#.NET中的自定义助手转换器

C#.NET中的自定义助手转换器,c#,converter,helper,C#,Converter,Helper,假设我有3个类A,B和C 所有类都属于不同的程序集,例如: A类属于组件A, B类属于组件B, C类属于组件C 此外,程序集_A引用程序集_B, 程序集C引用程序集B, 组件B不引用任何组件A/B 也就是说:ASSEMBLY_A------->ASSEMBLY_B您可以使用泛型来实现这一点,但您需要一个接口 在ASSEMBLY_B中创建如下界面: public interface IDataType { string property1 {get; set;} int prope

假设我有3个类A,B和C

所有类都属于不同的程序集,例如:

A类属于组件A, B类属于组件B, C类属于组件C

此外,程序集_A引用程序集_B, 程序集C引用程序集B, 组件B不引用任何组件A/B


也就是说:ASSEMBLY_A------->ASSEMBLY_B您可以使用泛型来实现这一点,但您需要一个接口

在ASSEMBLY_B中创建如下界面:

public interface IDataType
{
    string property1 {get; set;}
    int property2 {get; set; }
    bool property3 {get; set;}
}
public Y Convert<T, Y>(T itemToConvert) where T : new(), IDataType where Y : new(), IDataType
{
    return new Y 
            {
                property1 = itemToConvert.property1,
                property2 = itemToConvert.property2,
                property3 = itemToConvert.property3
            };
 }
然后在ASSEMBLY_B中创建一个通用方法,如下所示:

public interface IDataType
{
    string property1 {get; set;}
    int property2 {get; set; }
    bool property3 {get; set;}
}
public Y Convert<T, Y>(T itemToConvert) where T : new(), IDataType where Y : new(), IDataType
{
    return new Y 
            {
                property1 = itemToConvert.property1,
                property2 = itemToConvert.property2,
                property3 = itemToConvert.property3
            };
 }
public Y Convert(T itemToConvert)其中T:new(),IDataType其中Y:new(),IDataType
{
返回新的Y
{
property1=itemToConvert.property1,
property2=itemToConvert.property2,
property3=itemToConvert.property3
};
}
确保两个类都正确实现了这个接口。之后,您可以如下方式调用该方法:

DataTypeA itemToConvert;
// set some values here    
DataTypeC converted = ASSEMBLY_B.Convert<DataTypeA, DataTypeC>(itemToConvert);
DataTypeA itemToConvert;
//在这里设置一些值
DataTypeC converted=程序集转换(itemToConvert);

这是不可能的:如果您没有任何有关对象的信息,则无法转换该对象。 唯一的方法是在ASSEMBLY_D中添加接口:

  • IDataTypeA(由DataTypeA实现)
  • IDataTypeC(由DataTypeC实现)

然后,所有程序集都引用ASSEMBLY_D,并且ASSEMBLY_C具有将DataTypeA转换为DataTypeC所需的信息

如果DataTypeA和DataTypeC与您所说的一样等效,您能否在ASSEMBLY_B中创建类并去掉DataTypeA和DataTypeC来代替DataTypeB?不正确,请检查我的答案。使用泛型和泛型约束是可能的。您假设两个类可以实现相同的接口。我没有这样做,因为在他的示例中属性名称不同(propertyA1 propertyC1)。所以你的否决票是不值得的。但是你说的是不正确的:“如果你没有关于这个对象的任何信息,你就不能转换这个对象。”泛型和泛型约束在这方面特别好。除此之外,通过在不同的库中声明两个接口,您将一无所获,因为您无法实例化接口。加上OP需要双向转换。不,完全正确。泛型和泛型约束使用类型,因此您需要处理一个类型。在最初的场景中,您没有任何类型,也没有关于对象的任何信息。这就是为什么您在代码中添加了一个接口:检索有关对象的信息。如果您有足够的信息,为什么要添加一个接口?您不需要对象或类型的信息,只需要它公开的契约的信息。这就是为什么你需要这个界面。无论如何,你建议的解决方案没有意义,这就是为什么我投了否决票,如果你纠正错误,我将取消否决票太好了!正是我想要的。谢谢!