簡體   English   中英

轉換功能 <object, Task> 到功能 <T, Task> 在運行時

[英]Convert Func<object, Task> to Func<T, Task> at runtime

我有一個Func<object, Task> 我試圖將其作為參數傳遞給采用Func<T, Task>的函數。 我正在使用反射為該函數創建MethodInfo ,並且直到運行時才知道要填充的T

我該如何進行反思?

不需要做什么特別的。

Func<in T, out TResult>T輸入參數相反 ,每種類型都繼承自object ,這意味着您可以 Func<object, Task> Func<T, Task>Func<T, Task>任何引用類型 T -pass照原樣,它將正常工作。

現在,這不適用於值類型,因為這些值類型需要事先拆箱

因此,如果您的T是值類型,則必須將其包裝在另一個執行強制轉換的委托中。

一種簡單的方法是定義包裝方法:

private static Func<T, TResult> CastFunc<T, TResult>(Func<object, TResult> fn)
    => param => fn(param);

然后通過反射創建一個委托:

var result = (Func<int, Task>)typeof(WrapperClass)
    .GetMethod(nameof(CastFunc), BindingFlags.NonPublic | BindingFlags.Static)
    .MakeGenericMethod(typeof(int), typeof(Task)).Invoke(null, new object[] { fn });

我會使用MakeGenericMethod進行反思

這是一個簡單的示例:

    public class Example
    {
        public void Start()
        {
             Func<object, Task> func = o => null;
             object objFunc = func; // got it from a generic place as an object or something
             Type type = objFunc.GetType().GetGenericArguments()[0]; // get T in runtime
             var method = typeof(Example).GetMethod("DoSomething", BindingFlags.Public | BindingFlags.Instance).MakeGenericMethod(type);
             var result = method.Invoke(this, new object[1] { func });
        }

        public int DoSomething<T>(Func<T, Task> input)
        {
            return 1;
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM