c# - 将通用对象数组转换为两种类型

标签 c# casting

我有一个接收 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/

相关文章:

.net - 类型转换和解析的区别

javascript - 使用knockout js上传文件

c# - 查找 GroupBy ASP.NET MVC 中的实例数

c# - 协方差和向上转型之间的区别

c# - 基本类型转换 (c#)

c++ - 直接在 foreach 循环中强制转换

c# - 将 Base64 编码的字节转换为 Javascript 和 C# 中不同的字符串

c# - 如何在矩形中正确定位 "X"?

c# - 使用 Active Directory 连接到 Azure DB - 通用,并在 C# 中使用 MFA 支持身份验证

c# - 在 .NET 中,在实现隐式转换运算符时,是否可以访问分配给的对象?