English 中文(简体)
C#: 如何发现和制造能够满足多种类型限制的情况
原标题:C#: How to find and create instances which fulfills multiple type constraints
  • 时间:2009-10-05 18:48:37
  •  标签:

Saye 我有多种限制的通用方法:

public static void DoSomethingAwesome<T>(T thing)
    where T : IThing, IAwesome, IComparable<T>
{
    ...
}

现在......我如何能够利用思考,在那里创造我可以派到的东西?

如果这只是一个制约因素,我知道我可以这样做:

var types = assembly
      .GetTypes()
      .Where(typeof (IThing).IsAssignableFrom)

foreach(var t in types)
    DoSomethingAwesome((IThing) Activator.CreateInstance(t));

但是,能否真正地投向多个接口......地球上我如何解决这一问题? 你们可以说,现在我在这里损失了很多:

Title got型长而复杂,因为我肯定说什么,如果你能够<>,请改进。

最佳回答

除了Reed和Loror在寻找适当类型方面的答复外,我们注意到,由于你发现,汇编者没有向多个接口投放瞬时标。 你有两种选择:

  1. Create a new interface IAwesomeComparableThing which derives from IThing, IAwesome and IComparable<T>, have your types implement that, and cast to that.

  2. Invoke DoSomethingAwesome through reflection. To do this, you will need to get the MethodInfo for the DoSomethingAwesome generic method, then call MethodInfo.MakeGenericMethod with your type that implements all three interfaces.

(2)例:

Type type = sometype; // For example found using reeds method
MethodInfo mgeneric = typeof(Awesomeiser).GetMethod("DoSomethingAwesome");
MethodInfo mspecific = mgeneric.MakeGenericMethod(new [] { type });
mspecific.Invoke(null, new [] { type });
问题回答

我在那里猜测,你可以做一些原因。

var types = assembly
.GetTypes()
.Where(typeof (IThing).IsAssignableFrom && typeof (IAwesome).IsAssignableFrom))

你们需要一种从所有制约因素中可以分配的类型。 头两个是容易的,但第三个是小trick:

// Using
static bool IsIComparable(Type thing)
    {
        foreach (Type interfaceType in thing.GetInterfaces())
        {
            if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof (IComparable<>))
            {
                Type[] arguments = interfaceType.GetGenericArguments();
                if (arguments.Length == 1)
                {
                    if (arguments[0] == thing)
                        return true;
                }
            }
        }
        return false;
    }


// This returns an enumerable of compatible types:
var types = assembly.GetTypes().Where( t => 
   typeof(IThing).IsAssignableFrom(t) &&
   typeof(IAwesome).IsAssignableFrom(t) &&
   IsIComparable(t) );




相关问题