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

メソッド構文を使用してこれを行うことはできません。これは、コンパイル時にタイプがわかるためです。ただし、リフレクションを使用してメソッドを呼び出すことはできます。

このコードはあなたが始めるのに役立つはずです:

    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 に答える