首页 > 解决方案 > 将从字符串获得的自定义类型传递给具有泛型类型的函数

问题描述

在我的应用程序中,我正在使用一个包来读取描述房屋的特定类型的文件(比如说 .custom)。它有自定义类型来描述对象(t_doorst_windows保持简单)

这个包有一个功能Reader。GetAll < t_type >() 为我提供了文件中所述类型的所有对象,以及一个 Reader。GetItem < t_type >(int itemId) 给了我一个带有 itemId ID的特定t_type对象。

现在我正在从用户提供的文件中读取所需更新的列表,其中包括类型、id 和List<List<string>>. 这部分不在我的控制范围内。

我需要能够从字符串中读取类型并将其传递给我的通用函数。

到目前为止,我已经尝试过:

var r = new List<string>(){ "t_door", "1", "Color:Red" };
Type T = Type.GetType(r[0]);
ModifyProperties<T>(r[1], r[2]);

'T' is a variable but is used like a type.

同样的错误:

ModifyProperties<typeof(T)>(r[1], r[2]);

和 :

ModifyProperties<T.GetType()>(r[1], r[2]);

Operator '<' cannot be applied to operands of type 'method groups' and 'Type' 

这是ModifyProperties函数的签名:

public static void ModifyProperties<ObjectTypeToEdit>(string id, string modification) where ObjectTypeToEdit : t_object

到目前为止,我的解决方法是在类型上使用开关并使用正确的类型调用方法:

switch (r[0])
{
    case "t_door":
        ModifyProperties<t_door>(r[1], r[2]);
        break;
    case "t_window":
        ModifyProperties<t_window>(r[1], r[2]);
        break;
    ...
}

考虑到可能需要数百种类型的对象,这远非理想。

我还阅读了一些关于Activator类的内容,但我不确定它会有什么帮助。

与反射相同:

object obj = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(r[0]);

标签: c#genericstypes

解决方案


推荐阅读