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

基本クラスは、自分の派生クラスを認識していません。そのため、派生クラスのctorを取得できません。アセンブリからすべてのクラスを取得し、それらの中からacceptctorsを見つける必要があります

于 2013-01-02T13:25:13.963 に答える