回答:
Type.GetType("namespace.qualified.TypeName")
タイプがmscorlib.dllまたは現在実行中のアセンブリで見つかった場合にのみ機能します。
これらのどちらも当てはまらない場合は、アセンブリ修飾名が必要です。
Type.GetType("namespace.qualified.TypeName, Assembly.Name")
Assembly a = Assembly.Load("SomeLibrary");
アセンブリから型を名前で読み込むことができますType t = a.GetType("namespace.a.b.ClassName");
。
typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t) => t.FullName == youFullName);
かもしれないいくつかの手間を最終的に救うかもしれません
アセンブリ修飾名なしでDLL名を使用してタイプを取得することもできます。次に例を示します。
Type myClassType = Type.GetType("TypeName,DllName");
私も同じ状況で、うまくいきました。「DataModel.QueueObject」タイプのオブジェクトが必要であり、「DataModel」への参照があったため、次のようにタイプを取得しました。
Type type = Type.GetType("DataModel.QueueObject,DataModel");
コンマの後の2番目のストリングは、参照名(dll名)です。
NamespaceTypeName, AssemblyNameSpec
、AssemblyNameSpec
プロパティのないアセンブリの識別子です。この回答は基本的に受け入れられたものと同じですが、アセンブリプロパティがもたらす「ノイズ」の一部を排除するため(たとえばVersion
、Culture
PublicKeyToken
)、一部の人々はこれを好むと思います。幸い、プロパティはオプションです。
AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
この方法を試してください
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 ;
}
AppDomain
サポートされていないため、UWPでは機能しません。代替案がわからない。
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;
}
T
ジェネリック型のは取り除かれていることに注意してください。
クラスが現在のアセンブリにない場合は、qualifiedNameを指定する必要があります。このコードは、クラスの修飾名を取得する方法を示しています
string qualifiedName = typeof(YourClass).AssemblyQualifiedName;
そして、あなたはqualifiedNameでタイプを得ることができます
Type elementType = Type.GetType(qualifiedName);
ネストされたタイプの場合、の変換を忘れている可能性があります。+に
とにかく、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.GetType(String)を必要Type.AssemblyQualifiedNameあなたが使用する必要がありますAssembly.CreateQualifiedName(文字列、文字列)。
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
MyAssembly.GetName()。Nameを使用できるのは、Version、Culture、PublicKeyTokenが必要ないためです。
Type.GetType(String)について:
タイプが現在実行中のアセンブリまたはMscorlib.dllにある場合は、その名前空間で修飾されたタイプ名を指定するだけで十分です。
アセンブリ情報を含む完全な型名を使用してみてください。次に例を示します。
string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);
namesspace.classnameのみを使用して別のアセンブリのクラスのタイプを取得すると、同じ状況になり、機能しませんでした。上記のように、タイプ文字列にアセンブリ情報を含めた場合にのみ機能しました。
私にとっては、「+」が鍵でした!これは私のクラスです(ネストされたクラスです):
namespace PortalServices
{
public class PortalManagement : WebService
{
public class Merchant
{}
}
}
そして、このコード行は機能しました:
Type type = Type.GetType("PortalServices.PortalManagement+Merchant");
上記のこの解決策は私にとって最良のようですが、私にとってはうまくいかなかったので、次のようにしました:
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
ます。ただし、MSDNのAssemblyQualifiedNamesからのように、絶対パスは必須ではありません
私はだまされました。(名前で)作成したい型はすべてdll内にあるので、制御するdllに、単純な名前を取るアセンブリのdllに静的メソッドを配置し、そのコンテキストからtype.GetTypeを呼び出して結果を返します。
元々の目的は、タイプを構成データで名前で指定できるようにすることでした。それ以来、ユーザーが処理するフォーマットを指定するようにコードを変更しました。形式ハンドラクラスは、型が指定された形式を解析できるかどうかを決定するインターフェイスを実装します。次に、リフレクションを使用して、インターフェイスを実装するタイプを見つけ、フォーマットを処理するタイプを見つけます。したがって、構成は特定のタイプではなくフォーマット名を指定します。リフレクションコードは隣接するDLLを調べて読み込むことができるので、私は一種の貧乏人のプラグインアーキテクチャを持っています。