我正在尝试将某种类型转换为另一种泛型类型,但我找不到任何解决方案,以便在我的具体情况下如何做到这一点。简化的情况如下。请注意,这可能看起来非常奇怪和人为,但它只是指出我的问题。实际应用更有意义......: - )
// 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
我发现这非常难看。考虑到我在这里描述的情况,还有更好的方法吗?
答案 0 :(得分:1)
如果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)};
}
}