C# 是否有方法强制转换为泛型函数中传递的类型?

C# 是否有方法强制转换为泛型函数中传递的类型?,c#,.net,generics,casting,C#,.net,Generics,Casting,我想写一个通用函数,在几个不同的对象之间循环,这些对象有一个共同的字段。我想更改所有对象上的此字段 但是,我需要泛型函数中每个对象的类型 我的代码如下所示: UpdateObjects<objectType>(IMyCollection collection) { foreach (objectType obj in collection) { var correctlyTypedObject = (objectType)obj.MakeEditabl

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

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

我的代码如下所示:

UpdateObjects<objectType>(IMyCollection collection) {
    foreach (objectType obj in collection)
    {
        var correctlyTypedObject = (objectType)obj.MakeEditable();
        // Do stuff with correctlyTypedObject
    }
}
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);
}
MakeEditable更改了obj的类型,所以我需要将其回滚

有办法做到这一点吗

我按如下方式调用该函数: 更新对象集合


因为我使用userObject类型调用函数,所以我认为可以使用该类型在函数本身中强制转换对象。这个假设正确吗?

我不知道我是否完全理解你的问题,但在我看来,你在寻找能提供什么

假设三个类别A、B、C都具有属性p

然后函数可以如下所示:

UpdateObjects<objectType>(IMyCollection collection) {
    foreach (objectType obj in collection)
    {
        var correctlyTypedObject = (objectType)obj.MakeEditable();
        // Do stuff with correctlyTypedObject
    }
}
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);
}
可以这样使用:

UpdateObjects<objectType>(IMyCollection collection) {
    foreach (objectType obj in collection)
    {
        var correctlyTypedObject = (objectType)obj.MakeEditable();
        // Do stuff with correctlyTypedObject
    }
}
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);
}

既然可以有一个类型化的ICollection集合,为什么还要使用ICollection呢?强制转换是在编译时进行的。当您在编译时不知道确切的类型时,没有办法做到这一点。顺便说一句:您的循环allready执行强制转换,无需再次执行。ICollection是一种自制的集合类型,与任何现有ICollection无关。我甚至不知道那是件事,这不是重点。问题是:您知道编译时的objectType吗?好吧,这就引出了一个问题:你为什么要创建自己的集合类型?它们已经存在于框架中是有原因的。