1

我想对某个类型参数 T 使用反射来获取它的构造函数。

我想获得的构造函数是接受某些类型 ISomeType 或从它派生的任何类型的构造函数。

例如:

public interface ISomeType
{
}

public class SomeClass : ISomeType
{
}

我想找到接受 ISomeType、SomeClass 或任何其他 ISomeType 派生类的构造函数。

有什么简单的方法可以实现这一目标吗?

4

3 回答 3

6

你可以这样做:

public List<ConstructorInfo> GetConstructors(Type type, Type baseParameterType)
{
  List<ConstructorInfo> result = new List<ConstructorInfo>();

  foreach (ConstructorInfo ci in type.GetConstructors())
  {
    var parameters = ci.GetParameters();
    if (parameters.Length != 1)
      continue;

    ParameterInfo pi = parameters.First();

    if (!baseParameterType.IsAssignableFrom(pi.ParameterType))
      continue;

    result.Add(ci);
  }

  return result;
}

这相当于

public IEnumerable<ConstructorInfo> GetConstructors(Type type, Type baseParameterType)
{
    return type.GetConstructors()
            .Where(ci => ci.GetParameters().Length == 1)
            .Where(ci => baseParameterType.IsAssignableFrom(ci.GetParameters().First().ParameterType)
}

当你添加一些 LINQ 魔法时

于 2013-01-02T13:28:06.833 回答
1

你可以这样做:

Type myType = ...
var constrs = myType
    .GetConstructors()
    .Where(c => c.GetParameters().Count()==1
    && c.GetParameters()[0].ParameterType.GetInterfaces().Contains(typeof(ISomeType))
    ).ToList();
if (constrs.Count == 0) {
     // No constructors taking a class implementing ISomeType
} else if (constrs.Count == 1) {
     // A single constructor taking a class implementing ISomeType
} else {
     // Multiple constructors - you may need to go through them to decide
     // which one you would prefer to use.
}
于 2013-01-02T13:25:25.127 回答
0

基类不知道自己的派生类,这就是为什么你不能得到派生类的ctors。您必须从程序集中获取所有类并在其中找到接受 ctor

于 2013-01-02T13:25:13.963 回答