Требуется System.Reflection.ParameterInfo.ParameterType.IsGenericParameter. Вот прохождение модульного теста VS2008, которое иллюстрирует это:
Класс:
public class Foo<T>
{
public Foo(T val)
{
this.Value = val.ToString();
}
public Foo(string val)
{
this.Value = "--" + val + "--";
}
public string Value { get; set; }
}
Метод испытания:
Foo<string> f = new Foo<string>("hello");
Assert.AreEqual("--hello--", f.Value);
Foo<int> g = new Foo<int>(10);
Assert.AreEqual("10", g.Value);
Type t = typeof(Foo<string>);
t = t.GetGenericTypeDefinition();
Assert.AreEqual(2, t.GetConstructors().Length);
System.Reflection.ConstructorInfo c = t.GetConstructors()[0];
System.Reflection.ParameterInfo[] parms = c.GetParameters();
Assert.AreEqual(1, parms.Length);
Assert.IsTrue(parms[0].ParameterType.IsGenericParameter);
c = t.GetConstructors()[1];
parms = c.GetParameters();
Assert.AreEqual(1, parms.Length);
Assert.IsFalse(parms[0].ParameterType.IsGenericParameter);
Примечательной точкой здесь является проверка parms [0] .ParameterType.IsGenericParameter, которая проверяет, является ли параметр универсальным или нет.
Как только вы нашли свой конструктор, у вас есть ConstructorInfo для передачи Emit.
public System.Reflection.ConstructorInfo FindStringConstructor(Type t)
{
Type t2 = t.GetGenericTypeDefinition();
System.Reflection.ConstructorInfo[] cs = t2.GetConstructors();
for (int i = 0; i < cs.Length; i++)
{
if (cs[i].GetParameters()[0].ParameterType == typeof(string))
{
return t.GetConstructors()[i];
}
}
return null;
}
Не совсем точно, каково ваше намерение.