C#.NET中的自定义助手转换器
假设我有3个类A,B和C 所有类都属于不同的程序集,例如: A类属于组件A, B类属于组件B, C类属于组件C 此外,程序集_A引用程序集_B, 程序集C引用程序集B, 组件B不引用任何组件A/BC#.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
也就是说: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需要双向转换。不,完全正确。泛型和泛型约束使用类型,因此您需要处理一个类型。在最初的场景中,您没有任何类型,也没有关于对象的任何信息。这就是为什么您在代码中添加了一个接口:检索有关对象的信息。如果您有足够的信息,为什么要添加一个接口?您不需要对象或类型的信息,只需要它公开的契约的信息。这就是为什么你需要这个界面。无论如何,你建议的解决方案没有意义,这就是为什么我投了否决票,如果你纠正错误,我将取消否决票太好了!正是我想要的。谢谢!