Как сделать универсальный метод с аргументом TypeDelegator?

Столкнулся с интересной проблемой. Среда выполнения C# выдает исключение "Не поддерживается", когда я пытаюсь вызвать универсальный метод, созданный с аргументом TypeDelegator. Вот пример:

using System;
using System.Reflection;
using System.Linq.Expressions;

namespace ConsoleApplication2
{
    public class Arg { }
    public class MyTypeDelegator : TypeDelegator
    {
        protected override bool HasElementTypeImpl() { return false; }
    }
    public static class Extension
    {
        public static int Method<T>(this Arg arg) { return 0; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var methodInfo = typeof(Extension).GetMethod("Method").MakeGenericMethod(new MyTypeDelegator());
            // System.NotSupportedException here:
            methodInfo.Invoke(new Arg(), new Object[] { });
            // and here:
            var call = Expression.Call(methodInfo, new Expression[] {Expression.Constant(new Arg(), typeof(Arg)) });
        }
    }
}

Что бы обойти или решить эту проблему?

PS: я не могу удалить MyTypeDelegator, потому что он служит псевдонимом типа для динамических мягких классов, поступающих из сторонних библиотек. Подпись и реализация реального универсального метода зависят от конкретных данных, хранящихся в MyTypeDelegator.

0 ответов

Другие вопросы по тегам