0

このように FileHelpers を使用してファイルのインポートを行うときに、リフレクションを使用してクラス名を動的に指定します...

Assembly assembly = Assembly.GetExecutingAssembly();
AssemblyName assemblyName = assembly.GetName();
Type t = assembly.GetType(assemblyName.Name + ".FileDefinitions." + className);
FileHelperEngine engine = new FileHelperEngine(t);

ライブラリの最新バージョンを取得した後、私が上記で行っていたことは「時代遅れ」と見なされます

実装はこのようにジェネリックに変更されました

FileHelperEngine<myImportDefinitionClass> = new
                                 FileHelperEngine<myImportDefinitionClass>();

myImportDefintionClassしかし、実行時に動的に指定する方法がわかりません。元のリフレクション コードを使用しても機能しません。

更新: Paul のコードを試した後、FileHelpers クラス内のメソッドなどにアクセスできるようにする必要があります(この部分はコンパイルされません)。

fileHelperEngine.ErrorManager.ErrorMode = ErrorMode.SaveAndContinue;

importData = fileHelperEngine.ReadFileAsDT(filepath);

しかし、私は実際に何が起こっているのかについてははっきりしていません。ジェネリックの概念をよりよく理解するためのリンクも歓迎します。

4

2 に答える 2

2
Assembly assembly = Assembly.GetExecutingAssembly();
AssemblyName assemblyName = assembly.GetName();
Type emptyGenericType = typeof(FileHelperEngine<>);
Type genericTypeArgument = assembly.GetType(assemblyName.Name + ".FileDefinitions." + className);
Type completeGenericType = emptyGenericType.MakeGenericType(genericTypeArgument);
var fileHelperEngine = Activator.CreateInstance(completeGenericType);

残念ながら、結果のオブジェクトをジェネリック型に直接キャストすることはできません。c# はダック タイピングを実装していません。

インターフェイスまたは基本クラスを使用してそれにキャストするという2つのオプションがあると思います.fileHelperEngineはインターフェイスを実装しておらず、基本クラスには有用なメソッドがないため、役に立ちません。ライセンスで許可されている場合は、コードを変更して実装できます。

他のオプションは型をテストすることです。これはハックですが、可能性のリストが小さい場合は問題ありません。

if (fileHelperEngine is FileHelperEngine<string>)
    fileHelperEngine = fileHelperEngine as FileHelperEngine<string>;

于 2010-11-19T01:54:18.587 に答える
1

パントラック

昨日 [Obsolote] 属性の変更をコミットしました。実際には、次のリリースのライブラリの例を確認するためでしたが、現在は削除されています。

SVN の更新を行って再コンパイルすると、警告を回避できます。問題が発生して申し訳ありません:(

マルコス

于 2010-11-19T12:25:34.290 に答える