c# - 将从字符串获得的自定义类型传递给具有泛型类型的函数
问题描述
在我的应用程序中,我正在使用一个包来读取描述房屋的特定类型的文件(比如说 .custom)。它有自定义类型来描述对象(t_doors和t_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 - 试图理解 pthread_cond_signal()
- c - sqrt() - 为什么我可以提供 int 的参数,而不仅仅是 double 并且输出也是正确的?
- javascript - 在我再次单击之前,我的 C# 代码不会运行
- python - 无法使用 python 获取 MS SQL Server 路径
- python - 使用基本 conda 运行批处理文件以执行 python 脚本
- php - 与 HTML 和 PHP 的电子邮件集成
- swift - 下载图像时出现内存问题Swift5 iOS13
- python - 具有数据生成器的多输入 keras 神经网络模型
- bootstrap-4 - 为什么 Bootstrap btn 需要 width:100% 才能使引导按钮变为全宽?不应该显示:阻止;默认情况下使按钮全宽?
- c++ - CMake target_link_libraries 未链接共享库