如何根据类名获取用户定义的对象类型?

时间:2009-05-01 13:15:02

标签: c# generics

如果我将用户定义对象的类名作为字符串,如何在泛型函数中将其用作对象的类型?

SomeGenericFunction(的objectID);

2 个答案:

答案 0 :(得分:5)

如果您有字符串,那么首先要做的是使用Type.GetType(string)或(最好)Assembly.GetType(string)来获取Type实例。从那里,你需要使用反射:

Type type = someAssembly.GetType(typeName);
typeof(TypeWithTheMethod).GetMethod("SomeGenericFunction")
          .MakeGenericMethod(type).Invoke({target}, new object[] {objectID});

其中{target}是实例方法的实例,null是静态方法的实例。

例如:

using System;
namespace SomeNamespace {
    class Foo { }
}
static class Program {
    static void Main() {
        string typeName = "SomeNamespace.Foo";
        int id = 123;
        Type type = typeof(Program).Assembly.GetType(typeName);
        object obj = typeof(Program).GetMethod("SomeGenericFunction")
            .MakeGenericMethod(type).Invoke(
                null, new object[] { id });
        Console.WriteLine(obj);
    }
    public static T SomeGenericFunction<T>(int id) where T : new() {
        Console.WriteLine("Find {0} id = {1}", typeof(T).Name, id);
        return new T();
    }
}

答案 1 :(得分:0)

查看System.Type.GetType()方法 - 提供完全限定的类型名称,然后返回相应的Type对象。然后你可以这样做:

namespace GenericBind {
    class Program {
        static void Main(string[] args) {
            Type t = Type.GetType("GenericBind.B");

            MethodInfo genericMethod = typeof(Program).GetMethod("Method");
            MethodInfo constructedMethod = genericMethod.MakeGenericMethod(t);

            Console.WriteLine((string)constructedMethod.Invoke(null, new object[] {new B() }));
            Console.ReadKey();
        }

        public static string Method<T>(T obj) {
            return obj.ToString();
        }
    }

    public class B {
        public override string ToString() {
            return "Generic method called on " + GetType().ToString();
        }
    }
}