Как мне сделать тип универсального делегата в C # /. NET 4? - PullRequest
1 голос
/ 28 июня 2011

Я могу сделать тип делегата во время выполнения из списка параметра System.Type, благодаря ответу на вопрос здесь.

Но как мне это сделать, если один из параметров является универсальным параметром, скажем, он представляет собой что-то вроде следующего?

    delegate t ScanFun<t>();

Мне нужен System.Type, который представляет универсальный делегат, чтобы я мог вызвать метод Type.MakeGenericType с типом для универсального параметра t. Тем не менее, я даже не могу найти способ узнать, как это выглядит.

Использование в инструменте анализа кода. У меня есть код, который работает с известными типами:

System.Type[] parms = new Type[f.sig.Parms.list.Length + 1];
specs[0] = f.sig.ReturnType.Type;
for (int i = 0; i < f.sig.Parms.list.Length; i++)
    specs[i + 1] = f.sig.Parms.list[i].Type;
for (int i = 0; i < parmTypes_.Length; i++)
{
    if (f.sig.Generic.List.Contains(specs[i].Name))
    {
        /// TODO: Make generic parameter Type here
        goto done;
    }
    parms[i] = f.Parent.findType(specs[i]);
    done: ;
}
var dtype = System.Linq.Expressions.Expression.GetDelegateType(parms);

1 Ответ

2 голосов
/ 28 июня 2011
Type openScanFunType = typeof(ScanFun<>);
Type closedScanFunType = openScanFunType.MakeGenericType(new[] { typeof(int) });

В качестве альтернативы (и это работает лучше, если есть несколько параметров типа):

Type openScanFunType = typeof(ScanFun<string>).GetGenericTypeDefinition();
Type cloCsedScanFunType = openScanFunType.MakeGenericType(new[] { typeof(int) });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...