1

私は独特の問題に遭遇しました。私は動的なファクトリ プロジェクトに取り組んでおり、XML ファイルに基づいて新しいオブジェクトを作成できるようにすることを目的としています。私の問題はこれです:

  1. 私が持っている工場の基本クラスの別のプロジェクトがあります

    public abstract class DynamicContentFactory<T, Params> where T: class where Params: DynamicParameters
    
  2. この抽象クラスには、次のような静的メソッドCreateがあります

    public static T Create(Params data)
    
  3. Paramsには、デフォルトで という文字列が 1 つだけ含まれていますType。オブジェクトの作成を基本クラスと同じ名前空間に制限したいTので、次のようにします。

    string namespaceStr = typeof(T).ToString();
    namespaceStr = namespaceStr.Substring(0, namespaceStr.LastIndexOf('.') + 1);
    
    Type type = Type.GetType(namespaceStr + data.Type);
    
  4. 私のメイン プロジェクトには、特定のファクトリ クラスがあります。

    public class ItemFactory : DynamicContent.DynamicContentFactory<ItemFactory, ItemParameters>
    {
    }
    
  5. 問題は、 を呼び出すItemFactory.Createと がType.GetType返されることnullです。ItemFactory作成するアイテムと同じ名前空間に存在しますが、基本クラスは別の名前空間に存在します。これを回避する方法はありますか?

  6. Type.GetType()toのパラメーターを変更して、typeof(T).ToString()それが見つかるかどうかをテストしようとしましたが、それも見つかりませんでした。DynamicContent他の方法へのリンクが既に存在するため、自分のプロジェクトからメイン プロジェクトへのリンクを作成できません。初期化されたクラスの型さえ見つからないのはばかげていると思います。

私の質問は次のとおりです。これを回避する最善の方法は何ですか? DynamicContentプロジェクトをメイン プロジェクトに含めるのではなく、別のプロジェクトで別のライブラリとして維持したいと考えています。クラスを見つけさせる方法はありますか、それともメイン プロジェクトとプロジェクトの両方から参照できるようにするために、これで初期化するタイプの 3 番目のプロジェクトを作成する必要がありDynamicContentますか?

BR、

-サーミ

4

1 に答える 1

4

あなたが観察している動作は期待されています - Type.GetType

typeName - 取得する型のアセンブリ修飾名。AssemblyQualifiedName を参照してください。型が現在実行中のアセンブリまたは Mscorlib.dll にある場合は、その名前空間によって修飾された型名を指定するだけで十分です。

名前空間 + 名前だけで十分な指定された動作の「現在実行中のアセンブリ」部分に該当するため、現在のコードが機能することに注意してください。

  • 要求時に型の完全な名前を指定する必要がありますが、型が使用する名前空間を確認できます。
  • の代わりにAssembly.GetTypeに切り替えて、のアセンブリをType.GetType使用Tして、作成する型を検索できます。
  • 別の方法として、ロードされたすべてのアセンブリをスキャンして目的の型を探しますが、その型がまだロードされていないアセンブリからのものである場合は不十分な場合があります。

残り: .Net の名前空間名はあまり意味がありません。それらはコードを読みやすくするための規則ですが、アセンブリとそれに実装されている名前空間との間に特定のリンクはありません。

于 2013-03-13T16:34:02.970 に答える