Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建具有动态生成类型的泛型类对象_C#_Class_Generics_Reflection_Properties - Fatal编程技术网

C# 创建具有动态生成类型的泛型类对象

C# 创建具有动态生成类型的泛型类对象,c#,class,generics,reflection,properties,C#,Class,Generics,Reflection,Properties,我有一个通用类 public class MyClass<T> { public List<T> Translate(List<T> list, params string[] names) { //do something here,modify list and return list } } 但是在我的例子中,我不知道T类型是在运行时生成的,请参见下面的代码 String cl

我有一个通用类

public  class MyClass<T>
{
   public List<T> Translate(List<T> list, params string[] names)
           {
            //do something here,modify list and return list
       }
    }
但是在我的例子中,我不知道T类型是在运行时生成的,请参见下面的代码

String classname = string.Empty;

if(Classtype == 1)
{
    classname = "Employee"
}
else if(classtype == 2)
{
    classname = "Vehicle"
}
我想要下面的东西..这样我就可以创建这个泛型类的一个实例

MyClass<typeof(classname)> empp = new MyClass<typeof(classname)>();

    empp.Translate(MyList,"param1","param2")
MyClass empp=newmyclass();
empp.Translate(MyList,“param1”,“param2”)
请建议,我该怎么做。

试试看

var someType = Type.GetType("MyProject.Employee");
var yourGenericType = typeof(MyClass<>).MakeGenericType(new [] { someType });
var instance = Activator.CreateInstance(yourGenericType);
var someType=Type.GetType(“MyProject.Employee”);
var yourGenericType=typeof(MyClass).MakeGenericType(new[]{someType});
var instance=Activator.CreateInstance(yourGenericType);
请注意,Type.GetType(…)仅适用于类型的完整命名空间,如果您的类与执行此操作的代码不在同一dll中,则甚至适用于完整的程序集限定名。

请重试

var someType = Type.GetType("MyProject.Employee");
var yourGenericType = typeof(MyClass<>).MakeGenericType(new [] { someType });
var instance = Activator.CreateInstance(yourGenericType);
var someType=Type.GetType(“MyProject.Employee”);
var yourGenericType=typeof(MyClass).MakeGenericType(new[]{someType});
var instance=Activator.CreateInstance(yourGenericType);

请注意,Type.GetType(…)仅适用于类型的完整命名空间,或者如果您的类与执行此操作的代码不在同一dll中,则甚至适用于完整的程序集限定名。

感谢所有人的帮助,我可以通过这种方式完成此操作

        var someType = Type.GetType("MyProject.Employee");
        var genericType = typeof(Convert<>).MakeGenericType(new[] { someType });
        var instance = Activator.CreateInstance(genericType);

        string instanceType = instance.GetType().FullName;

        MethodInfo methodInfo = Type.GetType(instanceType).GetMethod("Translate");
        genericType.InvokeMember(methodInfo.Name, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, instance, new object[] { lstEmp, "Name", "City" });
var someType=Type.GetType(“MyProject.Employee”);
var genericType=typeof(Convert).MakeGenericType(new[]{someType});
var instance=Activator.CreateInstance(genericType);
字符串instanceType=instance.GetType().FullName;
MethodInfo MethodInfo=Type.GetType(instanceType.GetMethod(“翻译”);
genericType.InvokeMember(methodInfo.Name,BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance,null,Instance,new object[]{lstEmp,“Name”,“City”});

伊山

谢谢大家的帮助,我用这种方式做到了

        var someType = Type.GetType("MyProject.Employee");
        var genericType = typeof(Convert<>).MakeGenericType(new[] { someType });
        var instance = Activator.CreateInstance(genericType);

        string instanceType = instance.GetType().FullName;

        MethodInfo methodInfo = Type.GetType(instanceType).GetMethod("Translate");
        genericType.InvokeMember(methodInfo.Name, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, instance, new object[] { lstEmp, "Name", "City" });
var someType=Type.GetType(“MyProject.Employee”);
var genericType=typeof(Convert).MakeGenericType(new[]{someType});
var instance=Activator.CreateInstance(genericType);
字符串instanceType=instance.GetType().FullName;
MethodInfo MethodInfo=Type.GetType(instanceType.GetMethod(“翻译”);
genericType.InvokeMember(methodInfo.Name,BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance,null,Instance,new object[]{lstEmp,“Name”,“City”});
伊山

公共T CreateEmptyObject()
{
return(T)Activator.CreateInstance(typeof(T));;
}
称之为:

YourClassObject yourClassObject = CreateEmptyObject<YourClassObject>();
YourClassObject YourClassObject=CreateEmptyObject();
public T CreateEmptyObject()
{
return(T)Activator.CreateInstance(typeof(T));;
}
称之为:

YourClassObject yourClassObject = CreateEmptyObject<YourClassObject>();
YourClassObject YourClassObject=CreateEmptyObject();

那么OP如何调用某个方法或直接访问实例的某些属性而不使用
反射
?这并不是一个完美的解决方案。@Moeri,如果您想访问任何独立的属性,您需要将这些属性提取到接口,那么可以使用
Type.GetType(className)
。否则,就像你说的那样,你会被反射所困扰。@AlexFilipovici在他的例子中,他的类名只是实际的类名,而不是程序集限定的或完整的命名空间名。但我会在这篇文章中添加一些东西,好主意。:)@Moeri现在我想调用我的泛型类的方法,我如何做像Instance.Mymethod(参数)这样的事情;那么OP如何在不使用
反射的情况下直接调用某个方法或访问实例的某些属性呢?这并不是一个完美的解决方案。@Moeri,如果您想访问任何独立的属性,您需要将这些属性提取到接口,那么可以使用
Type.GetType(className)
。否则,就像你说的那样,你会被反射所困扰。@AlexFilipovici在他的例子中,他的类名只是实际的类名,而不是程序集限定的或完整的命名空间名。但我会在这篇文章中添加一些东西,好主意。:)@Moeri现在我想调用我的泛型类的方法,我如何做像Instance.Mymethod(参数)这样的事情;拥有
T
对您真的有用吗,还是只需要运行时
类型
?可能的@TimS副本。现在我想调用我的泛型类的方法,我怎样才能做像Instance.Mymethod(parameters)这样的事情@gunr2171现在我想调用我的泛型类的方法,我如何做像Instance.Mymethod(参数)这样的事情;我认为您还应该描述在未来的代码中应该如何使用泛型类型。拥有
T
对您实际有用吗,还是您只需要运行时
type
?可能的@TimS副本。现在我想调用我的泛型类的方法,我怎样才能做像Instance.Mymethod(parameters)这样的事情@gunr2171现在我想调用我的泛型类的方法,我如何做像Instance.Mymethod(参数)这样的事情;我相信您还应该描述在未来的代码中应该如何使用泛型类型。