web-dev-qa-db-ja.com

フルネームからC#タイプを作成する

私は次のことをしているタイプのフルネームからTypeオブジェクトを取得しようとしています:

Assembly asm = Assembly.GetEntryAssembly();  
string toNativeTypeName="any type full name";
Type t = asm.GetType(toNativeTypeName);

Nullになるのはなぜですか?

アセンブリは私の実行可能ファイル(.net実行可能ファイル)であり、タイプ名はSystem.Xml.XmlNodeです。

15
Adi Barda

まあ、それが本当にタイプのフルネーム(つまり名前空間を含む)であり、それがそのアセンブリにある場合、それは機能するはずです。そうでない例を挙げていただけますか? Assembly.GetTypeではなくType.GetTypeを使用しているので、すべきではありません型名にアセンブリ名を含めてください。

ジェネリック型の名前は、期待したものではないことに注意してください。たとえば、次を使用します。

Assembly.GetType("System.Collections.Generic.List`1");

汎用リストタイプを取得するには、Type.MakeGenericTypeを使用してタイプ引数を指定します。

もちろん、これはタイプがジェネリックである場合にのみ関係します。それが問題ではない場合は、タイプが実際にエントリアセンブリにあることを再確認します。

編集:ああ、ネストされたタイプは、関連する場合は「Container.Nested」ではなく「Container + Nested」になることに注意してください...

30
Jon Skeet

以下の私の提案を参照してください。速度のためにビジネス名前空間のみをループします

private static Type GetBusinessEntityType(string typeName)
{
    Debug.Assert(typeName != null);

    List<System.Reflection.Assembly> assemblies = AppDomain.CurrentDomain.GetAssemblies()
        .Where(a => a.FullName.StartsWith("AF.BusinessEntities")).ToList();

    foreach (var Assembly in assemblies)
    {
        Type t = Assembly.GetType(typeName, false);
        if (t != null)
            return t;
    }
    throw new ArgumentException(
        "Type " + typeName + " doesn't exist in the current app domain");
}

これを行う別の方法は次のとおりです。

Type t = System.Web.Compilation.BuildManager.GetType("the.type", true, false);

少なくとも楽しみのために、リフレクターを使用してそれがどのように行われるかを確認してください:)

10

get type!を使用するようにアセンブリを定義している理由、また名前空間を配置する必要があります

string toNativeTypeName = "System.Int32";
Type t = Type.GetType(toNativeTypeName );
MessageBox.Show(t.FullName);
7
Wael Dalloul

タイプ名が間違っている可能性があります。コードで型への参照を作成し、そのType.FullNameプロパティを確認すると、型の名前がどのように表示されるかがわかります。

また、Type.GetTypeメソッドを試して、何が返されるかを確認することもできます。たぶんあなたのタイプはそのアセンブリにまったく含まれていませんか?

編集:Type.FullNameプロパティの使用について間違っていたことが判明しました。 Type.AssemblyQualifiedNameプロパティを使用すると、Type.GetTypeで使用できる完全修飾名を取得できます。

System.Xml.XmlNodeの場合、次の名前が付けられます:System.Xml.XmlElement, System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

4
Rune Grimstad

私はこのスレッドに出くわし、元の質問が完全に回答されていないことに気づきました。私は間違っている可能性がありますが、質問を読む際に、作成者の意図は、参照されているアセンブリまたはアプリケーションの一部からタイプを取得できるようにすることだったと思います。

これが私がその問題を解決するためにしたことです。

public static Type GetTypeFromFullName(string fullClassName)
{
    AssemblyPartCollection parts = Deployment.Current.Parts;

    foreach (var part in parts)
    {
        Uri resUri = new Uri(part.Source, UriKind.Relative);
        Stream resStream = Application.GetResourceStream(resUri).Stream;
        Assembly resAssembly = part.Load(resStream);
        Type tryType = resAssembly.GetType(fullClassName, false);
        if (tryType != null)
            return tryType;
    }

    return null;
}
3
justind