このコード:
Type.GetType("namespace.a.b.ClassName")
null
を返します。
そして私は使用しています:
using namespace.a.b;
更新:
型が存在し、別のクラスライブラリにあり、文字列名で取得する必要があります。
Type.GetType("namespace.qualified.TypeName")
は、mscorlib.dllまたは現在実行中のアセンブリでタイプが見つかった場合にのみ機能します。
これらのいずれも当てはまらない場合は、 アセンブリ修飾名 が必要です。
Type.GetType("namespace.qualified.TypeName, Assembly.Name")
また、アセンブリ修飾名なしでタイプを取得することもできますが、たとえば、dll名も使用できます。
Type myClassType = Type.GetType("TypeName,DllName");
私は同じ状況にあり、それは私のために働いた。 「DataModel.QueueObject」タイプのオブジェクトが必要で、「DataModel」への参照があったため、次のようにタイプを取得しました。
Type type = Type.GetType("DataModel.QueueObject,DataModel");
コンマの後の2番目の文字列は、参照名(dll名)です。
この方法を試してください
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 ;
}
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;
}
アセンブリがASP.NETアプリケーションのビルドの一部である場合、BuildManagerクラスを使用できます。
using System.Web.Compilation
...
BuildManager.GetType(typeName, false);
クラスが現在のアセンブリにない場合は、qualifiedNameを指定する必要があります。このコードは、クラスのqualifiednameを取得する方法を示しています
string qualifiedName = typeof(YourClass).AssemblyQualifiedName;
そして、qualifiedNameで型を取得できます
Type elementType = Type.GetType(qualifiedName);
ネストされたTypeの場合、の変換を忘れている可能性があります。 +
とにかく、typeof( T).FullName
はあなたが言っていることを教えてくれます
編集:ところで、(使用していると確信しているように)使用は、コンパイル時のコンパイラーに対するディレクティブにすぎないため、API呼び出しの成功に影響を与えることはできません。 (プロジェクトまたはアセンブリ参照がある場合、潜在的に影響を与える可能性があります-したがって、情報は役に立たないので、フィルタリングが必要です...)
データベースで指定されたアクセス権を持つユーザーコントロールに応じて、ユーザーコントロールを開きます。そこで、このメソッドを使用してTypeNameを取得しました...
Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))
そのため、strTypeに返された値を使用して、そのオブジェクトのインスタンスを作成できます。
クラス名のみがある場合、これを使用します。
Type obj = AppDomain.CurrentDomain.GetAssemblies().SelectMany(t => t.GetTypes()).Where(t => String.Equals(t.Name, _viewModelName, StringComparison.Ordinal)).First();
アセンブリが参照され、クラスが表示される場合:
typeof(namespace.a.b.ClassName)
型が見つからないため、GetTypeはnullを返します。typeofを使用すると、コンパイラがエラーの検出に役立つ場合があります。
アセンブリ情報を含む完全なタイプ名を使用してみてください。例:
string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);
Namesspace.classnameのみを使用して別のアセンブリ内のクラスの型を取得しているときに同じ状況が発生し、機能しませんでした。上記のように、タイプ文字列にアセンブリ情報を含めた場合にのみ機能しました。
コンマが完全修飾名の直後にあることを確認してください
typeof(namespace.a.b.ClassName, AssemblyName)
これはうまくいかないので
typeof(namespace.a.b.ClassName ,AssemblyName)
これに数日間困惑しました
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のみが必要です。
これ 上記の解決策は私にとって最良のようですが、私にとってはうまくいきませんでしたので、次のようにしました:
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 からわかるように、絶対パスは要件ではありません。
私にとって、「+」が鍵でした!これは私のクラスです(ネストされたものです):
namespace PortalServices
{
public class PortalManagement : WebService
{
public class Merchant
{}
}
}
そして、次のコード行が機能しました:
Type type = Type.GetType("PortalServices.PortalManagement+Merchant");
私はごまかした。 (名前で)作成する型はすべて制御するdllにあるため、アセンブリ内のdllに単純な名前を取得し、そのコンテキストからtype.GetTypeを呼び出して結果を返す静的メソッドを配置するだけです。 。
元の目的は、構成データ内で名前で名前を指定できるようにすることでした。その後、ユーザーが処理する形式を指定するようにコードを変更しました。形式ハンドラクラスは、型が指定された形式を解析できるかどうかを決定するインターフェイスを実装します。次に、リフレクションを使用して、インターフェイスを実装する型を見つけ、その形式を処理する型を見つけます。そのため、構成は特定のタイプではなく、フォーマット名を指定します。リフレクションコードは、隣接するdllを参照してロードできるため、ある種の貧乏人のプラグインアーキテクチャがあります。