我想对某个类型参数 T 使用反射来获取它的构造函数。
我想获得的构造函数是接受某些类型 ISomeType 或从它派生的任何类型的构造函数。
例如:
public interface ISomeType
{
}
public class SomeClass : ISomeType
{
}
我想找到接受 ISomeType、SomeClass 或任何其他 ISomeType 派生类的构造函数。
有什么简单的方法可以实现这一目标吗?
我想对某个类型参数 T 使用反射来获取它的构造函数。
我想获得的构造函数是接受某些类型 ISomeType 或从它派生的任何类型的构造函数。
例如:
public interface ISomeType
{
}
public class SomeClass : ISomeType
{
}
我想找到接受 ISomeType、SomeClass 或任何其他 ISomeType 派生类的构造函数。
有什么简单的方法可以实现这一目标吗?
你可以这样做:
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 魔法时
你可以这样做:
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.
}
基类不知道自己的派生类,这就是为什么你不能得到派生类的ctors。您必须从程序集中获取所有类并在其中找到接受 ctor