Можно ли привести Func <объект, объект> к Func <T1, TResult>, используя отражение без Reflection.Emit - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь создать реализацию автоматических фабрик делегатов в стиле Autofac, которая будет работать с AOT (в частности, Unity3d и IL2CPP).

Основная проблема, с которой я столкнулся, заключается в невозможности привести от Func<object, object> к Func<T1, TResult> во время выполнения.

Есть ли какой-нибудь способ сделать это с помощью отражения, но избежать генерации кода IL во время выполнения (т.е. без Reflection.Emit)?

Func<object, object> func = delegate (object arg1)
{
    return arg1.ToString() + " bar";
};

Func<string, string> func2;
func2 = (Func<string, string>)func;


Console.WriteLine(func2("foo")); // "foo bar" ? :(
// System.InvalidCastException: Unable to cast object of type 'System.Func`2[System.Object,System.Object]' to type 'System.Func`2[System.String,System.String]'.

1 Ответ

0 голосов
/ 02 июля 2018

Я не верю, что можно привести Func одного типа к Func другого типа. В зависимости от варианта использования вы можете обернуть одно в другое для достижения желаемого результата, как показано ниже.

Func<object, object> func = delegate (object arg1)
{
    return arg1.ToString() + " bar";
};

// Wrap func with a call by func2 to get the desired casting.
Func<string, string> func2 = o => func(o) as string;

Console.WriteLine(func2("foo"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...