将动态加载类型传递给SomeFunction <t> </t>

时间:2011-09-26 14:01:31

标签: c# generics filehelpers

我试图传递一个动态加载的dll的类型(它使用一个接口,但我需要 conectrete这个实现到一个函数,我错过了一些东西。

var data = LoadAssemblyFromParamenter(pathToDataDll);
Type dataType = data.GetType().MakeGenericType(data.GetType());
SomeTest<dataType>();

public void SomeTest<T>() 
{
    //do something with T 
}

错误是“找不到类型或命名空间'dataType'coulnd ...”

具体类型适用于FileHelpers对象(使用字段),因此我需要具体的实现。

P.S。这必须是.net 3.5 ....

详细说明 SomeMethod<T>( IEnumerable<T> items )来电

public static void WriteRecords<T>(IEnumerable<T> records, string fileName )
    where T: ICMSDataDictionary
{
    if (records == null || String.IsNullOrEmpty(fileName))
        return;

    if (records.Any())
    {
        FileHelpers.DelimitedFileEngine<T> engine =
            new FileHelpers.DelimitedFileEngine<T>();
        engine.WriteFile(fileName, records);
    }
}

2 个答案:

答案 0 :(得分:2)

使用Method语法不能这样做,因为为此你可以在编译时知道类型。但是,您可以使用反射来调用您的方法。

此代码可以帮助您开始:

    static void Main(string[] args)
    {
        //Get method Method[T]
        var method = typeof(Program).GetMethod("Method", BindingFlags.NonPublic | BindingFlags.Static);
        //Create generic method with given type (here - int, but you could use any time that you would have at runtime, not only at compile time)
        var genericMethod = method.MakeGenericMethod(typeof(int));
        //Invoke the method
        genericMethod.Invoke(null, null);
    }

    static void Method<T>()
    {
        Console.WriteLine(typeof(T).Name);
    }

使用object,它类似,但你必须使用反射动态构造对象。

答案 1 :(得分:1)

使用“动态”关键字:

public void Doit() {
  dynamic data=LoadAssemblyFromParamenter(pathToDataDll);
  SomeTest(data);
}

public void SomeTest<T>(T arg) {
  Debug.WriteLine("typeof(T) is "+typeof(T));
}

!!!编辑!!!:抱歉,我错过了你需要3.5 Framework。如果是这样,请使用:

public void Doit() {
  var data=LoadAssemblyFromParamenter(pathToDataDll);
  var mi=this.GetType().GetMethod("SomeTest").MakeGenericMethod(data.GetType());
  mi.Invoke(this, new object[0]);
}

public void SomeTest<T>() {
  Debug.WriteLine("typeof(T) is "+typeof(T));
}