C#方法调用时动态创建类 适配不同类型validatedInputs入参需求
你之前的写法报错是因为C#泛型的类型参数要求是编译期可确定的类型,不能使用运行时的字符串变量作为类型参数传入,对应有两种解决方案:
方案1:使用泛型方法(优先推荐)
如果调用方法时可以确定validatedInputs对应的具体类型,直接将方法定义为泛型方法即可,既有编译期类型校验,也没有额外性能损耗:
public class DataStore<T> { public T data { get; set; } } // 直接传入实体实例的版本 public void ProcesAsyncReq<T>(T validatedInputs, string data1, string data2) { DataStore<T> gclass1 = new DataStore<T>(); gclass1.data = validatedInputs; // 后续传递给dataprovider的逻辑 } // 传入JSON字符串需要反序列化的版本 public void ProcesAsyncReq<T>(string validatedInputsJson, string data1, string data2) { DataStore<T> gclass1 = new DataStore<T>(); gclass1.data = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(validatedInputsJson); // 后续传递给dataprovider的逻辑 }
调用方式示例:
// 传入Employee类型参数,编译器也可以根据入参自动推断类型省略尖括号内容 ProcesAsyncReq<Employee>(employeeInstance, "data1", "data2"); ProcesAsyncReq<Agency>(agencyJsonStr, "data1", "data2");
方案2:运行时动态构造泛型(仅当编译期完全无法确定类型时使用)
如果确实只有运行时才能拿到类型的字符串名称,就需要用反射构造泛型类型,缺点是没有编译期校验,性能略低:
public void ProcesAsyncReq(string className, string validatedInputs, string data1, string data2) { // 注意className需要包含完整命名空间,否则会找不到类型 Type entityType = Type.GetType(className); // 构造DataStore<T>的具体闭合泛型类型 Type dataStoreType = typeof(DataStore<>).MakeGenericType(entityType); // 反射实例化对象 object gclass1 = Activator.CreateInstance(dataStoreType); // 反序列化对应类型的对象 object dataValue = Newtonsoft.Json.JsonConvert.DeserializeObject(validatedInputs, entityType); // 反射给data属性赋值 dataStoreType.GetProperty("data").SetValue(gclass1, dataValue); // 后续传递给dataprovider的逻辑 }
内容的提问来源于stack exchange,提问作者Shalini Raj
相关产品推荐
相关产品推荐

