【问题标题】:How can I use reflection to find which open generic argument on an open generic type implements a generic interface?如何使用反射来查找开放泛型类型上的哪个开放泛型参数实现了泛型接口?
【发布时间】:2012-08-09 02:08:39
【问题描述】:

在我的代码中,我将获得一个类型对象,该对象代表一个开放的通用类,该类实现(至少)2 个开放的通用接口。我知道这些接口中的至少一个(示例中为 IGiveOneValue)。这是一个完整的工作示例:

using System;
namespace ConsoleApplication22
{
    interface IGiveOneValue<T>
    {
        T Value { get; }
    }

    interface IGiveAnother<T>
    {
        T Value { get; }
    }

    class ValueImplementation<T1, T2> : IGiveOneValue<T1>, IGiveAnother<T2>
    {
        public ValueImplementation(T1 value1, T2 value2)
        {
            v1 = value1;
            v2 = value2;
        }

        T1 v1;
        T2 v2;

        T1 IGiveOneValue<T1>.Value { get { return v1; } }
        T2 IGiveAnother<T2>.Value { get { return v2; } }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var genericArguments = typeof(ValueImplementation<,>).GetGenericArguments();
            // genericArguments.Length == 2
            // how can I tell which argument will fulfill IGiveOneValue<T>?
            // assuming they could be implemented in any order

            // these parameters might be in the wrong order:
            var closedType = typeof(ValueImplementation<,>).MakeGenericType(new[] { typeof(int), typeof(string)});
            var instance = Activator.CreateInstance(closedType, 1, "2");
        }
    }
}

如何使用反射来确定 ValueImplementation 类中的哪个 open 泛型参数对应于 IGiveOneValue 的成员,以便我可以在 MakeGenericType 方法中将特定类型传递给它?

【问题讨论】:

    标签: c# generics


    【解决方案1】:

    GetInterfaces 方法将获取类型的接口,它还允许您使用 GetGenericArguments。所以如果你想知道类型实现哪个接口使用哪个类型约束,你可以试试:

    var genericArguments = typeof(ValueImplementation<,>).GetGenericArguments();
    var implementedInterfaces = typeof(ValueImplementation<,>).GetInterfaces();
    
    foreach (Type _interface in implementedInterfaces) {
        for (int i = 0; i < genericArguments.Count(); i++) {
            if (_interface.GetGenericArguments().Contains(genericArguments[i])) {
                Console.WriteLine("Interface {0} implements T{1}", _interface.Name, i + 1);
            }
        }
    }
    

    希望我已理解您的问题,并希望这能提供一些指导。

    【讨论】:

    • 谢谢,我不知道在这种情况下通用参数会相互相等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    相关资源
    最近更新 更多