存储通用类型参数以供进一步使用

时间:2015-10-24 14:00:37

标签: c# generics c#-4.0

有没有办法存储通用类型参数以供进一步使用。 场景就是这样的。

Queue<ApiHandlerHelper> requestQueue = new Queue<ApiHandlerHelper> ();

public void HitApi<T> (ApiHandlerHelper helper)
    {
        if (_IfHandlerProcessing) {
            requestQueue.Enqueue (helper);
        } else {
            StartCoroutine (checkInternetConnection<T> ());
            _IfHandlerProcessing = true;
        }
    }

HitApi接收来自多个管理员的呼叫,我想检查Hitpi是否忙于处理一个管理器的请求,即将发出的请求将进入队列内。现在我需要存储Generic类型参数“T”以便在以后的阶段使用。像这样的东西

AoiHandlerObject.StoreGenerticType<T> ();

我需要存储T类型,以便在我们收到前一位经理的回复时自动调用HitApi。

3 个答案:

答案 0 :(得分:1)

您无法存储泛型类型参数,但您可以为泛型参数执行此操作。虽然您无法在编译期间提供通用参数类型,但使用反射可以调用泛型方法(或实例化泛型类型):

Type genericArg1 = typeof(T);

现在应该使用反射来调用你的方法:

// obj.HitApi<T>(ApiHandlerHelper helper)
typeof(ClassContainingHitApiMethod)
      .GetMethod("HitApi", BindingFlags.Public | BindingFlags.Instance)
      .MakeGenericMethod(genericArg1)
      .Invoke(instanceOfClassContainingHitApiMethod, new object[] { instanceOfApiHelper });

答案 1 :(得分:0)

使用typeof(T)检索表示传递给T参数的类型的Type实例。然后,您可以存储此Type实例以供进一步使用,就像任何其他对象引用一样。

答案 2 :(得分:0)

如果要存储null类型的实例,存储$email = new PHPMailer(); $email->From = 'donotreply@example.com'; $email->FromName = 'donotreply@example.com'; $email->Subject = $subject; $email->Body = $msg; $email->AddAddress( $to ); $email->IsHTML(true); if($_FILES['fUpload']['tmp_name'][0] !== '' && preg_match("/image/", $_FILES['fUpload']['type'][0])){ $file_to_attach = $_FILES['fUpload']['tmp_name'][0]; $email->AddAttachment( $file_to_attach , $_FILES['fUpload']['name'][0]); } $sent = $email->Send(); 的类型,则可以使用Type

T

但是从变量 typeof(T)获取var type = typeof(T); StoreType(type); 可能很麻烦,因为它需要一些反思。我认为实际上可能更少工作来存储HitApi<T>,具体取决于您的确切需求。