C# 如何使T参数可用

C# 如何使T参数可用,c#,begininvoke,C#,Begininvoke,我正在编写一个异步类来简化函数操作。下面是我的代码: using System; namespace AsyncLibery { public class AsyncLibery { delegate void Exec(); // No input parameter, no return value delegate void ExecWithParams<T>(T T1); //One input parameter, no return value

我正在编写一个异步类来简化函数操作。下面是我的代码:

using System;

namespace AsyncLibery
{
public class AsyncLibery
{
    delegate void Exec(); // No input parameter, no return value
    delegate void ExecWithParams<T>(T T1); //One input parameter, no return value
    delegate void ExecWithParams<T1, T2>(T1 t1,T2 t2); //Two input parameters, no return value 
    delegate void ExecWithParams<T1, T2, T3>(T1 t1, T2 t2, T3 t3);//Three input parameters, no return value
    delegate void ExecWithParams<T1, T2, T3, T4>(T1 t1, T2 t2, T3 t3, T4 t4);//Four input parameters,no return value

    delegate T  ExecWithReturnType<T>(); //No input parameter, one return value
    delegate T2 ExecWithReturnType<T1, T2>(T1 t1); //One input parameter, one return value
    delegate T3 ExecWithReturnType<T1, T2, T3>(T1 t1, T2 t2);//Two input parameters, one return value
    delegate T4 ExecWithReturnType<T1, T2, T3, T4>(T1 t1, T2 t2, T3 t3);//Three input parameters, one return value
    delegate T5 ExecWithReturnType<T1, T2, T3, T4, T5>(T1 t1, T2 t2, T3 t3, T4 t4);// Four input parameters, one return value.

    #region no input parameter, no return value
    public void BeginInvokeEx(Action actionFunction)
    {
        Exec exec = new Exec(actionFunction);
        exec.BeginInvoke(new AsyncCallback(EndInvokeEx), exec);
    }

    private void EndInvokeEx(IAsyncResult iar)
    {
        Exec exec = (Exec)iar.AsyncState;
        exec.EndInvoke(iar);
    }
    #endregion

    #region one input parameter, no return value
    public void BeginInvokeEx<T>(Action<T> actionFunction,T T1)
    {
        ExecWithParams<T> exec = new ExecWithParams<T>(actionFunction);
        exec.BeginInvoke(T1, new AsyncCallback(EndInvokeEx1), exec);
    }

    private void EndInvokeEx1(IAsyncResult iar)
    {
        ExecWithParams<T> exec = (ExecWithParams<T>)iar.AsyncState;
        exec.EndInvoke(iar);
    }
    #endregion
}
}
使用系统;
命名空间异步自由
{
公共类异步自由
{
委托void Exec();//没有输入参数,没有返回值
delegate void ExecWithParams(T T1);//一个输入参数,没有返回值
delegate void ExecWithParams(T1 T1,T2 T2);//两个输入参数,没有返回值
委托void ExecWithParams(T1、T2、T3);//三个输入参数,无返回值
delegate void ExecWithParams(T1 T1、T2 T2、T3 T3、T4 T4);//四个输入参数,无返回值
委托T ExecWithReturnType();//没有输入参数,只有一个返回值
委托T2 ExecWithReturnType(T1);//一个输入参数,一个返回值
委托T3 ExecWithReturnType(T1 T1,t2t2);//两个输入参数,一个返回值
委托T4 ExecWithReturnType(T1、T2、T3);//三个输入参数,一个返回值
委托T5 ExecWithReturnType(T1 T1、T2 T2、T3 T3、T4 T4);//四个输入参数,一个返回值。
#区域无输入参数,无返回值
公共无效BeginInvokeEx(行动功能)
{
Exec Exec=新Exec(操作函数);
exec.BeginInvoke(新的异步回调(EndInvokeEx),exec);
}
私有void EndInvokeEx(IAsyncResult iar)
{
Exec Exec=(Exec)iar.AsyncState;
执行端调用(iar);
}
#端区
#区域1输入参数,无返回值
公共无效BeginInvokeEx(操作函数,T T1)
{
ExecWithParams exec=新的ExecWithParams(actionFunction);
exec.BeginInvoke(T1,新的异步回调(EndInvokeEx1),exec);
}
私有void EndInvokeEx1(IAsyncResult iar)
{
ExecWithParams exec=(ExecWithParams)iar.AsyncState;
执行端调用(iar);
}
#端区
}
}
当我编译代码时,它会抛出一个异常,如“找不到类型或命名空间名称'T'(是否缺少using指令或程序集引用?)。异常出现在下面的代码中:

ExecWithParams<T> exec = (ExecWithParams<T>)iar.AsyncState;
ExecWithParams exec=(ExecWithParams)iar.AsyncState;
我知道我们必须引用T参数的特定类型,如int、string或其他任何类型。 但是谁能在不修改T参数的情况下帮助我呢?有什么好办法处理吗?
thx.

您还没有定义什么是
t
。您需要在方法
EndInvokeEx1
上有一个泛型参数,使其成为
EndInvokeEx
,然后可以将
T
传递给cast。否则,它将需要在类声明中定义,因此您的类声明将成为
公共类AsyncLibrary
。否则,编译器将不知道
t
表示什么。

您尚未定义
t
是什么。您需要在方法
EndInvokeEx1
上有一个泛型参数,使其成为
EndInvokeEx
,然后可以将
T
传递给cast。否则,它将需要在类声明中定义,因此您的类声明将成为
公共类AsyncLibrary
。否则,编译器将不知道
t
要表示什么。

Make
EndInvokeEx1
泛型:

private void EndInvokeEx1<T>(IAsyncResult iar)
{
    ExecWithParams<T> exec = (ExecWithParams<T>)iar.AsyncState;
    exec.EndInvoke(iar);
}

使
EndInvokeEx1
通用:

private void EndInvokeEx1<T>(IAsyncResult iar)
{
    ExecWithParams<T> exec = (ExecWithParams<T>)iar.AsyncState;
    exec.EndInvoke(iar);
}

无论您做什么,请将其重命名为
AsyncLibrary
您在
EndInvokeEx1
中缺少一个
。您不使用
Func
Action
委托的原因是什么?或者,更准确地说,从
操作
强制转换到自定义委托?@AdamHouldsworth-如此简单的建议,如此真实。@AdamHouldsworth毫不犹豫地这样做,除非您知道这些类型(反射、DI等)中存在“神奇字符串”。在阅读代码时,一遍又一遍地看到这一点非常烦人。无论您做什么,请将其重命名为
AsyncLibrary
您在
EndInvokeEx1
中缺少了一个
。您不使用
Func
Action
委托有什么原因吗?或者,更准确地说,从
操作
强制转换到自定义委托?@AdamHouldsworth-如此简单的建议,如此真实。@AdamHouldsworth毫不犹豫地这样做,除非您知道这些类型(反射、DI等)中存在“神奇字符串”。在阅读代码时一遍又一遍地看到这一点真是令人恼火。还有一个问题,如何使用Func或Action通过使用BeginInvoke执行异步操作?@user1118566:只需调用
actionFunction.BeginInvoke(…)
。不需要创建新的委托。另一个问题,如何使用Func或Action通过使用BeginInvoke执行异步操作?@user1118566:只需调用
actionFunction.BeginInvoke(…)
。不需要创建新的委托。