我有一个接收 Object[] 然后对该数组执行操作的方法。
起初我将这个数组作为 IEnumerable<T>
传入但是 T 可以是两种不同的类型。
T 将始终具有相同的属性,即使它们是不同的类型也是如此。
是否可以在运行时转换为一种类型,以便我可以使用我知道每个类型都将包含的属性?
所以在可能的情况下:
var dataObject = (IEnumerable<T>) dataArray;
是否有可能做到:
var dataObject = (dataArray.GetType()) dataArray;
最佳答案
你能修改这两个T
类型的源代码吗?如果是这样,那么您可以让它们都(a) 继承自一个公共(public)基类,或者(b) 实现一个公共(public)接口(interface)。
编辑以下评论...
要适应 ID 属性的不同类型,您可以使用 explicit interface implementation .这将允许您在通过公共(public)接口(interface)访问时将第二个对象的 ID 公开为 Int64
。 (当不通过接口(interface)访问时,ID 属性仍可作为 Int32
访问。)
不幸的是,显式接口(interface)实现需要对您的原始类型进行更多更改。
void YourMethod(IEnumerable<ICommonToBothTypes> sequence)
{
foreach (var item in sequence)
{
Console.WriteLine(item.ID);
}
}
// ...
public interface ICommonToBothTypes
{
long ID { get; }
}
public class FirstType : ICommonToBothTypes
{
public long ID
{
get { return long.MaxValue; }
}
}
public class SecondType : ICommonToBothTypes
{
// the real Int32 ID
public int ID
{
get { return int.MaxValue; }
}
// explicit interface implementation to expose ID as an Int64
long ICommonToBothTypes.ID
{
get { return (long)ID; }
}
}
关于c# - 将通用对象数组转换为两种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1702221/