【问题标题】:Is there a way to cast to the type passed in a generic function?有没有办法转换为泛型函数中传递的类型?
【发布时间】:2019-12-11 11:47:36
【问题描述】:

我想编写一个通用函数,循环遍历几个不同的对象,这些对象有一个共同的字段。我想在所有对象上更改此字段。

但是,我需要通用函数中每个对象的类型。

我的代码如下所示:

UpdateObjects<objectType>(IMyCollection collection) {
    foreach (objectType obj in collection)
    {
        var correctlyTypedObject = (objectType)obj.MakeEditable();
        // Do stuff with correctlyTypedObject
    }
}

MakeEditable() 改变了 obj 的类型,所以我需要将它转换回来。

有没有办法做到这一点?

我调用函数如下: UpdateObjects&lt;userObject&gt;(collection);

由于我使用userObject 类型调用函数,我认为您可以使用该类型在函数本身内转换对象。这个假设正确吗?

【问题讨论】:

  • 既然可以拥有ICollection&lt;YourType&gt; 的类型化集合,为什么还要使用ICollection
  • 铸造是在编译时。当您在编译时不知道确切的类型时,就没有办法做到这一点。顺便说一句:您的循环已经进行强制转换,无需再次进行。
  • ICollection 是一个自制的集合类型,与任何现有的 ICollection 无关。甚至不知道那是一回事。
  • 这不是重点。问题是:你在编译时知道objectType 吗?否则就没有泛型的用处。
  • 好吧,这引出了一个问题:你为什么要制作自己的收藏类型?它们已经存在于框架中是有原因的。

标签: c# .net generics casting


【解决方案1】:

我不知道我是否完全理解您的问题,但在我看来,您正在寻找dynamic 提供的内容。

假设三个类 A,B,C 都具有属性 P

class A { public int P { get; set; } }
class B { public int P { get; set; } }
class C { public int P { get; set; } }

那么函数可能如下所示:

private void UpdateObjects(dynamic[] collection)
{
    int newValue = 123456;
    foreach (dynamic obj in collection)
    {
        obj.P = newValue;
    }
}

可以这样使用:

dynamic[] collection = new dynamic[] {new A(), new B(), new C()};
UpdateObjects(collection);

// Result
foreach (dynamic o in collection)
{
    int p = o.P;
    Debug.WriteLine(p);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2021-10-13
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多