要通过反射在C#中创建自定义泛型,需要遵循以下步骤:
- 使用Type.MakeGenericType方法创建泛型类型的实例对象,并传递一个类型数组,该数组包含泛型类型所需的类型参数。
- 使用Activator.CreateInstance方法创建泛型类型对象的实例。
- 必要时使用反射获取泛型类型对象上的属性和方法,以使其在程序中正确运行。
以下是两个示例说明:
示例1:创建一个泛型类型
// 定义泛型类
public class MyGenericClass<T>
{
public T Value { get; set; }
}
// 创建泛型类型
Type myGenericType = typeof(MyGenericClass<>); // 通过 typeof 获取泛型类型
Type[] typeParams = { typeof(string) }; // 创建类型数组,传递 T 的类型参数
Type myType = myGenericType.MakeGenericType(typeParams); // 创建泛型类型的实例对象
// 创建泛型类型的实例
object myInstance = Activator.CreateInstance(myType); // 创建泛型类型的实例对象
var valueProp = myType.GetProperty("Value"); // 获取类型对象的 Value 属性
valueProp.SetValue(myInstance, "Hello World"); // 设置 Value 属性的值
Console.WriteLine(valueProp.GetValue(myInstance)); // 输出 "Hello World"
示例2:通过泛型类型创建一个泛型方法
public class MyGenericClass<T>
{
public void MyMethod<S>(S value)
{
Console.WriteLine(
$"MyMethod called with value: {value}, type parameters: {typeof(T).Name}, {typeof(S).Name}");
}
}
Type myGenericType = typeof(MyGenericClass<>); // 通过 typeof 获取泛型类型
Type[] typeParams = { typeof(int) }; // 创建类型数组,传递 T 的类型参数
Type myType = myGenericType.MakeGenericType(typeParams); // 创建泛型类型的实例对象
// 通过泛型类型创建泛型方法
string methodName = "MyMethod";
var myMethod = myType.GetMethod(methodName);
Type[] methodTypeParams = { typeof(string) }; // 创建类型数组,传递 S 的类型参数
var constructedMethod = myMethod.MakeGenericMethod(methodTypeParams);
// 调用泛型方法
object myInstance = Activator.CreateInstance(myType); // 创建泛型类型的实例对象
constructedMethod.Invoke(myInstance, new object[] { "test" }); // 输出 "MyMethod called with value: test, type parameters: Int32, String"
以上就是C#中创建自定义泛型的完整攻略及示例说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#通过反射创建自定义泛型 - Python技术站