3

我正在尝试将动态加载的 dll 的类型(它使用一个接口,但我需要它的具体实现)传递给一个函数并且缺少一些东西。

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

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

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

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

ps这必须是.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);
    }
}
4

2 回答 2

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);
    }

与对象类似,但您必须使用反射动态构造对象。

于 2011-09-26T14:18:14.717 回答
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 框架。如果是这样,请使用:

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));
}
于 2011-09-26T14:15:27.797 回答