web-dev-qa-db-ja.com

Type.GetType( "namespace.a.b.ClassName")はnullを返します

このコード:

Type.GetType("namespace.a.b.ClassName")

nullを返します。

そして私は使用しています:

using namespace.a.b;

更新:

型が存在し、別のクラスライブラリにあり、文字列名で取得する必要があります。

191
Omu

Type.GetType("namespace.qualified.TypeName")は、mscorlib.dllまたは現在実行中のアセンブリでタイプが見つかった場合にのみ機能します。

これらのいずれも当てはまらない場合は、 アセンブリ修飾名 が必要です。

Type.GetType("namespace.qualified.TypeName, Assembly.Name")
206
DrPizza

また、アセンブリ修飾名なしでタイプを取得することもできますが、たとえば、dll名も使用できます。

Type myClassType = Type.GetType("TypeName,DllName");

私は同じ状況にあり、それは私のために働いた。 「DataModel.QueueObject」タイプのオブジェクトが必要で、「DataModel」への参照があったため、次のようにタイプを取得しました。

Type type = Type.GetType("DataModel.QueueObject,DataModel");

コンマの後の2番目の文字列は、参照名(dll名)です。

168
Asaf Pala

この方法を試してください

 public static Type GetType(string typeName)
        {
            var type = Type.GetType(typeName);
            if (type != null) return type;
            foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
            {
                type = a.GetType(typeName);
                if (type != null)
                    return type;
            }
            return null ;
        }
72
peyman
Dictionary<string, Type> typeCache;
...
public static bool TryFindType(string typeName, out Type t) {
    lock (typeCache) {
        if (!typeCache.TryGetValue(typeName, out t)) {
            foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) {
                t = a.GetType(typeName);
                if (t != null)
                    break;
            }
            typeCache[typeName] = t; // perhaps null
        }
    }
    return t != null;
}
24
erikkallen

アセンブリがASP.NETアプリケーションのビルドの一部である場合、BuildManagerクラスを使用できます。

using System.Web.Compilation
...
BuildManager.GetType(typeName, false);
23
LarryBud

クラスが現在のアセンブリにない場合は、qualifiedNameを指定する必要があります。このコードは、クラスのqualifiednameを取得する方法を示しています

string qualifiedName = typeof(YourClass).AssemblyQualifiedName;

そして、qualifiedNameで型を取得できます

Type elementType = Type.GetType(qualifiedName);
10

ネストされたTypeの場合、の変換を忘れている可能性があります。 +

とにかく、typeof( T).FullNameはあなたが言っていることを教えてくれます

編集:ところで、(使用していると確信しているように)使用は、コンパイル時のコンパイラーに対するディレクティブにすぎないため、API呼び出しの成功に影響を与えることはできません。 (プロジェクトまたはアセンブリ参照がある場合、潜在的に影響を与える可能性があります-したがって、情報は役に立たないので、フィルタリングが必要です...)

8
Ruben Bartelink

データベースで指定されたアクセス権を持つユーザーコントロールに応じて、ユーザーコントロールを開きます。そこで、このメソッドを使用してTypeNameを取得しました...

Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))

そのため、strTypeに返された値を使用して、そのオブジェクトのインスタンスを作成できます。

6
Stephan

クラス名のみがある場合、これを使用します。

Type obj = AppDomain.CurrentDomain.GetAssemblies().SelectMany(t => t.GetTypes()).Where(t => String.Equals(t.Name, _viewModelName, StringComparison.Ordinal)).First();
4
Marchino

アセンブリが参照され、クラスが表示される場合:

typeof(namespace.a.b.ClassName)

型が見つからないため、GetTypeはnullを返します。typeofを使用すると、コンパイラがエラーの検出に役立つ場合があります。

4
Guillaume

アセンブリ情報を含む完全なタイプ名を使用してみてください。例:

string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);

Namesspace.classnameのみを使用して別のアセンブリ内のクラスの型を取得しているときに同じ状況が発生し、機能しませんでした。上記のように、タイプ文字列にアセンブリ情報を含めた場合にのみ機能しました。

4
Ismail Hawayel

コンマが完全修飾名の直後にあることを確認してください

typeof(namespace.a.b.ClassName, AssemblyName)

これはうまくいかないので

typeof(namespace.a.b.ClassName ,AssemblyName)

これに数日間困惑しました

3
jack_tux

Type.GetType(String) が必要 Type.AssemblyQualifiedName を使用する必要があります Assembly.CreateQualifiedName(String、String) .

string typeName = "MyNamespace.MyClass"; // Type.FullName
string assemblyName = "MyAssemblyName"; // MyAssembly.FullName or MyAssembly.GetName().Name
string assemblyQualifiedName = Assembly.CreateQualifiedName(assemblyName , typeName);
Type myClassType = Type.GetType(assemblyQualifiedName);

AssemblyNameとしてFullNameを使用する必要はありません。バージョン(Culture)およびPublicKeyTokenのない名前withoutのみが必要です。

2
Florian Talour

これ 上記の解決策は私にとって最良のようですが、私にとってはうまくいきませんでしたので、次のようにしました:

AssemblyName assemblyName = AssemblyName.GetAssemblyName(HttpContext.Current.Server.MapPath("~\\Bin\\AnotherAssembly.dll"));
string typeAssemblyQualifiedName = string.Join(", ", "MyNamespace.MyType", assemblyName.FullName);

Type myType = Type.GetType(typeAssemblyQualifiedName);

前提条件は、アセンブリのパスを知っていることです。私の場合、これは別の内部プロジェクトからビルドされたアセンブリであり、プロジェクトのbinフォルダに含まれているため、知っています。

重要な場合、Visual Studio 2013を使用している場合、ターゲット.NETは4.0です。これはASP.NETプロジェクトなので、HttpContextを介して絶対パスを取得しています。ただし、 AssemblyQualifiedNamesのMSDN からわかるように、絶対パスは要件ではありません。

1
Ozair Kafray

私にとって、「+」が鍵でした!これは私のクラスです(ネストされたものです):

namespace PortalServices
{
public class PortalManagement : WebService
{
    public class Merchant
    {}
}
}

そして、次のコード行が機能しました:

Type type = Type.GetType("PortalServices.PortalManagement+Merchant");
1
Arash Masir

私はごまかした。 (名前で)作成する型はすべて制御するdllにあるため、アセンブリ内のdllに単純な名前を取得し、そのコンテキストからtype.GetTypeを呼び出して結果を返す静的メソッドを配置するだけです。 。

元の目的は、構成データ内で名前で名前を指定できるようにすることでした。その後、ユーザーが処理する形式を指定するようにコードを変更しました。形式ハンドラクラスは、型が指定された形式を解析できるかどうかを決定するインターフェイスを実装します。次に、リフレクションを使用して、インターフェイスを実装する型を見つけ、その形式を処理する型を見つけます。そのため、構成は特定のタイプではなく、フォーマット名を指定します。リフレクションコードは、隣接するdllを参照してロードできるため、ある種の貧乏人のプラグインアーキテクチャがあります。

0
Darrel Lee