2016-07-01 13 views
2

サードパーティの.Netアセンブリを使用すると、 "dotnet-namespace.dotnet-type from .Net assembly dotnetassembly.dll。 "という新しいタイプのdotnetassembly.dllが使用されます。 dotnet-namespaceの以前の「-type」は新しい名前空間に移動されましたnew-dotnet-namespaceの完全修飾名はnew-dotnet-namespace.dotnet-typeになりましたC#での型名空間の問題

今私の質問新しいネームスペース、つまり新しいネームスペース、つまりドットネットネームスペースではなく新しいドットネットネームスペースでタイプドットネットタイプを探すようにランタイムに指示する方法はありますか?

私たちが望むときには、指し示す新しいバージョンのアセンブリではなく、同じアセンブリ内で異なる名前空間に型をリダイレクトすることは可能ですか? 新しい名前空間の型を使用する新しいバージョンのthridparty.dllを取得するオプションがありません。

+1

これを達成することは、非常に大きな事業となるでしょう。何らかの逆コンパイルを実行して結果を解析して、探しているものを見つけることができるコードを書く必要があります。 –

+1

もちろん、コードを再コンパイルしてください。何か他のものが可能であり、実用的でないと非生産的であると仮定します。マイクロソフトはこの種のワッフルにかなり力を入れています。あなたがリフレクションを使いたいなら、誰もあなたを止めるつもりはありません。 –

+0

他のコメントに同意します。あなたはそうかもしれませんが、私はむしろ名前空間を変更することを選んだ人々と言葉を持っています。 –

答えて

3

いいえ、1つのタイプを別のタイプにリダイレクトするために.NET Frameworkには何もありません。

名前空間は、ソースコード内で名前を短くするための文法的な砂糖にすぎないことに注意してください.Net自体の名前空間は型名の一部にすぎないので、あなたの質問は本質的に「型を別のものに向けることができますか?

ソリューション:

  • 新しいタイプを指すように
  • 書き換えIL
  • ビルドプロキシアセンブリを再コンパイルします。あなたはタイプの名前空間から独立している

    Type dotNetType = FindType("dotnet-type", "dotnetassembly"); 
    

    この方法:あなたはこれを呼ぶだろう

    public Type FindType(string typeName, string assemblyName) 
    { 
        Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().SingleOrDefault(a => a.GetName().Name == assemblyName); 
        return assembly != null ? assembly.GetTypes().SingleOrDefault(t => t.Name == typeName) : null; 
    } 
    

    :どの程度

+1

LOL ...おそらくコードを変更して名前空間を変更するよりも多大な労力を要します。 – Rahul

0

副作用として、アセンブリ内に同じ名前の2つの型がある場合、このメソッドはどの型を返すべきかを知ることができないため、単に機能しません(実際には、例外)。 SingleOrDefaultFirstOrDefaultに変更して、最初の発生を戻すことができます。

もちろん、実行時に型を参照するので、コンパイラ時のメリットはすべて失われます。

+0

アセンブリ内に同じ 'typeName'を持つ複数の型がある場合はどうなりますか? –

+0

それは良い質問です。私は同じ名前の型ではうまくいかないことを明確にすべきです。 –