【问题标题】:Custom Helper Converter in C# .NETC# .NET 中的自定义助手转换器
【发布时间】:2023-12-25 06:09:01
【问题描述】:

假设我有 3 个 A、B 和 C 类。

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

A 类属于程序集 ASSEMBLY_A, B 类属于程序集 ASSEMBLY_B, C类属于程序集ASSEMBLY_C

另外,ASSEMBLY_A 引用了 ASSEMBLY_B, ASSEMBLY_C 引用 ASSEMBLY_B, ASSEMBLY_B 不引用任何程序集 A/B。

即:ASSEMBLY_A ------> ASSEMBLY_B

A 类有一个 IList 自定义集合 C 类有一个 IList 自定义集合

class DataTypeA
{
    propertyA1 -> string type
    propertyA2 -> int type
    propertyA3 -> bool type
}

class DataTypeC
{
    propertyC1 -> string type
    propertyC2 -> int type
    propertyC3 -> bool type
}

注意propertyA1等价于propertyC1,propertyA2等价于propertyC2,propertyA3等价于propertyC3。

所以我想在 ASSEMBLY_B 中有一个辅助方法来执行以下操作:

1) 将 A 类的 IList 转换为 C 类的 IList。 2) 将 Class C 的 IList 转换为 Class A 的 IList。

如何做到这一点?

【问题讨论】:

  • 你能不能简单地在 ASSEMBLY_B 中创建类并去掉 DataTypeA 和 DataTypeC 来代替 DataTypeB 如果它们和你说的一样等价吗?

标签: c# converter helper


【解决方案1】:

您可以使用泛型来完成此操作,但您需要一个接口。

在 ASSEMBLY_B 中创建这样的接口:

public interface IDataType
{
    string property1 {get; set;}
    int property2 {get; set; }
    bool property3 {get; set;}
}

然后在 ASSEMBLY_B 中创建一个像这样的泛型方法:

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
            };
 }

确保你的两个类都正确实现了这个接口。之后,您可以像这样调用该方法:

DataTypeA itemToConvert;
// set some values here    
DataTypeC converted = ASSEMBLY_B.Convert<DataTypeA, DataTypeC>(itemToConvert);

【讨论】:

  • 太棒了!正是我想要的。非常感谢!
【解决方案2】:

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

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

那么所有程序集都引用了ASSEMBLY_D,而ASSEMBLY_C就有了将DataTypeA转换为DataType C所需的信息

【讨论】:

  • 不正确,请检查我的答案。泛型和泛型约束是可能的
  • 您假设两个类可以实现相同的接口。我没有这样做,因为他的示例中的属性名称不同(propertyA1 propertyC1)。所以你的反对票是不值得的。
  • 你说的是不正确的:“如果你没有关于这个对象的任何信息,你就不能转换一个对象。”泛型和泛型约束在这方面特别好。除此之外,通过在不同的库中声明两个接口,您将一无所获,因为您无法实例化接口。再加上 OP 想要双向转换。
  • 不,完全正确。泛型和泛型约束使用类型,因此您需要使用类型。在原始场景中,您没有任何类型,也没有关于对象的任何信息。这就是您在代码中添加接口的原因:检索有关对象的信息。如果你有足够的信息,为什么要添加一个接口?
  • 您不需要对象或类型的信息,您只需要有关它公开的合同的信息。这就是你需要接口的原因。无论如何,您建议的解决方案没有意义,这就是我投反对票的原因,如果您纠正错误,我将删除反对票
最近更新 更多