gpt4 book ai didi

c# - 将对象显式转换为 C# 中仅在运行时可用的泛型类型的另一个对象

转载 作者:行者123 更新时间:2023-11-30 17:51:23 31 4
gpt4 key购买 nike

我正在尝试将某种类型转换为另一种通用类型,但我找不到在我的特定情况下如何完成此操作的任何解决方案。简化情况如下。请注意,这可能看起来很奇怪和做作,但这只是为了指出我的问题。实际应用更有意义... :-)

// Raw data coming from some source
public class RawDataType { }

// Abstract base class for structured data representing this raw data
public abstract class AbstractListDataType { }

// Generates lists of structured data
public class ListGenerator<TListDataType> where TListDataType : AbstractListDataType
{
public List<TListDataType> GenerateList()
{
// Get the data from some mysterious place
RawDataType data = new RawDataType() { ... }
// Cast it to the required structured data type
return new List<TListDataType>() { data as TListDataType ??? }
}
}

然后在另一个程序集中,在运行时加载,这个原始数据有一些具体的表示。 ListGenerator 本身完全不知道这些类型。加载包含结构化数据类型的程序集后,将通过反射检查它以查看可以生成哪些类型的结构化数据。

// Two types of structured application data that can be created from the raw data
public class ListDataTypeA : AbstractListDataType
{
public static explicit operator ListDataTypeA(RawDataType data) { ... }
}
public class ListDataTypeB : AbstractListDataType
{
public static explicit operator ListDataTypeB(RawDataType data) { ... }
}

当然,

data as TListDataType

没有意义。如何实现从 RawDataType 到 ListDataTypeA 的动态转换,我知道有一个显式转换可用但仅在运行时可用?

编辑:

似乎以下有效:

(TListDataType)(dynamic)data

我觉得这非常丑陋。考虑到我在这里描述的情况,还有更好的方法吗?

最佳答案

如果 dynamic 方法不适合您 - 尝试更标准的工厂模式。

由于显式转换是在编译时解析的,因此您必须自己手动调用该方法(即通过反射)。

我会走另一条路,将“加载”方法添加到 AbstractListDataType 或使用工厂方法/类来创建所需类的项目:

 public abstract class AbstractListDataType { 
public void Load(RawData data)....
}

public class ListGenerator<TListDataType>
where TListDataType : AbstractListDataType, new()

public List<TListDataType> GenerateList()
{
RawDataType data = new RawDataType() { ... }
var item = new T();
item.Load(data);
return new List<TListDataType>() { item };
}
}

或者工厂方法:

 public abstract class ListItemFactory<T> 
{
abstract public T CreateFromRawData(RawDataType data);
}

public class ListGenerator<TListDataType>
where TListDataType : AbstractListDataType
{
ListItemFactory<TListDataType> factory;
public ListGenerator<TListDataType>(ListItemFactory<TListDataType> factory)
{
this.factory = factory;
}

public List<TListDataType> GenerateList()
{
RawDataType data = new RawDataType() { ... }
return new List<TListDataType>() { factory.CreateFromRawData(data)};
}
}

关于c# - 将对象显式转换为 C# 中仅在运行时可用的泛型类型的另一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19611555/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com