2014-02-15 104 views
3

我想要一些如何在类类型中作为参数传入方法。这样类类型的反射

public void DoWork<TClass>(int time) 
{ 
    IJobDetail job = JobBuilder.Create<TClass>() 
       .WithIdentity("job1", "group1") 
       .Build(); 
} 

事情是有可能得到的CLASSTYPE作为一个参数或以某种方式由该类型的对象的反射获取类类型?

更新1: 我只是想用一个通用的类型和收到此错误

`The type TClass cannot be used as type parameter T in the generic type or method quartz.jobbuilder.create<T>(). There is now boxing conversion or type parameter conversion from tclass to quartz.ijob` 

石英的创建方法

// Summary: 
    //  Create a JobBuilder with which to define a Quartz.IJobDetail, and set the 
    //  class name of the job to be executed. 
    // 
    // Returns: 
    //  a new JobBuilder 
    public static JobBuilder Create<T>() where T : IJob; 
+0

你可以显示'Create'方法的定义吗? –

+0

我把它放在我原来的帖子 – imGreg

回答

2

你可能寻找一个generic功能 - 这允许您的功能指定类型参数:

public void DoWork<TClass>(int time) 
    where TClass : quartz.ijob 
{ 
    IJobDetail job = JobBuilder.Create<TClass>() 
     .WithIdentity("job1", "group1") 
     .Build(); 
} 

编辑

您也可以对type参数进行限制,这似乎是这里所要求的。使用语法where TClass : quartz.ijob

编辑#2

注意,一个泛型方法的调用者必须指定类型参数。所以,你必须调用:

DoWork<SomeClassType>(123); 

但是,如果方法的签名包含了一般类型的参数,那么编译器可以用它来推断类型。所以,如果签名是:

public void DoWork<TClass>(int time, TClass instance) 
    where TClass : quartz.ijob 

然后呼叫者可以调用它像这样:

var myInstance = new SomeClassType(); // SomeClassType must inherit quartz.ijob 
DoWork(123, myInstance); 

以上,myInstance类型是在编译时知道,所以编译器可以推断出泛型类型。但是,如果你的类型实例是boxed,那么该类型是不知道,直到运行时,编译器不能帮助你:

function SomethingOrOther(object instance) 
{ 
    DoWork(123, instance); // will not compile, as the compiler doesn't know the type of "instance" 
} 

在这种情况下,它可以调用DoWork无论如何,由使用反射(请参阅MakeGenericMethod)。但是,这种对泛型进行反思的方法变得复杂,快速。它也违背了泛型的目的(即编译时安全性),并且通常表示设计缺陷。

+0

这似乎是修复错误,我还没有测试它,但我会测试它后报告。 – imGreg

+0

验证它的工作原理,你解释它会 – imGreg

0

一般来说,是的。

您可以通过typeof(YourClassHere)yourObject.GetType()获得对象类型。

然后你就可以轻松地与acitvator创建对象:Activator.CreateInstance(type, parameters for constructor)

编辑时,问题EDIT 当你有通用那就更简单了。

public void DoWork<TClass>(int time) 
{ 
    IJobDetail job = (IJobDetail) Activator.CreateInstance(typeof(TClass), null /* no parameters */); 
       job.WithIdentity("job1", "group1"); 
       job.Build(); 
}