在Generic方法中调用类方法

时间:2014-05-08 12:19:43

标签: c# generics

我有以下代码:

private void StartTask<T>(string parameter)
{
    dynamic instance = (T) Activator.CreateInstance(typeof(T), parameter);

    Task.Factory.StartNew(() => instance.DoCompare());
}

这不起作用,并且不会调用“DoCompare()”方法...如何使用泛型类型方法中的参数调用类中的方法?

我正在上课:

public class Something {
     private string _parameter;

     public Something(string parameter) {
     _parameter = parameter;
     }

     public void DoCompare(){
      //Do longrunning task
     }
}

编辑:由于混淆而删除了约束BaseClass5

EDIT2 :我得到:类型

的第一次机会异常
  

'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException'

EDIT3:

这似乎有效,问题似乎是Task.Factory.StartNew:

private void StartTaskAwesomium<T>() where T 
{
    dynamic instance = (T) Activator.CreateInstance(typeof (T), parameter);
    instance.Test();
}

3 个答案:

答案 0 :(得分:0)

理论上你的代码应该可行,但它是一个“ fire-and-forget ”模式,这意味着它将在某个时间执行 ,但你无法控制那或者可以检查它是否实际执行或是否有例外 也许把它改成:

private async void StartTask<T>(string parameter) where T : BaseClass5
{
    BaseClass5 instance = (T)Activator.CreateInstance(typeof(T), parameter);
    await Task.Factory.StartNew(() => instance.DoCompare());
}

由于您的通用约束,您不需要dynamic,因为您知道T必须是BaseClass5或基于它。

或者将任务返回到await(或task.Wait())其他地方:

private Task StartTask<T>(string parameter)
{
    T instance = (T)Activator.CreateInstance(typeof(T), parameter);
    return Task.Factory.StartNew(() => instance.DoCompare());
}

答案 1 :(得分:0)

解决方案是将类的创建包装在Task本身中,如下所示:

private void StartTask<T>(string connectionId) where T : BaseClass5
{          
    Task.Factory.StartNew(() =>
    {
        dynamic instance = (T) Activator.CreateInstance(typeof (T), connectionId);
        instance.DoCompare();
    });
}

答案 2 :(得分:-1)

 private void StartTask<T>(string parameter)
{
    dynamic instance = (T) Activator.CreateInstance(typeof(T), parameter);

    Task.Factory.StartNew(() => {instance.DoCompare();});
}

这似乎有效。