Bu kod:
Type.GetType("namespace.a.b.ClassName")
döner null
.
ve ben kullanıcılarda var:
using namespace.a.b;
Güncelleme:
Tür var, farklı bir sınıf kitaplığında ve ben dize adı ile almak gerekir.
Bu kod:
Type.GetType("namespace.a.b.ClassName")
döner null
.
ve ben kullanıcılarda var:
using namespace.a.b;
Güncelleme:
Tür var, farklı bir sınıf kitaplığında ve ben dize adı ile almak gerekir.
Yanıtlar:
Type.GetType("namespace.qualified.TypeName")
yalnızca tür mscorlib.dll veya o anda yürütülmekte olan derlemede bulunduğunda çalışır.
Bunlardan hiçbiri doğru değilse, derlemeye uygun bir ada ihtiyacınız olacaktır :
Type.GetType("namespace.qualified.TypeName, Assembly.Name")
Assembly a = Assembly.Load("SomeLibrary");
- ve sonra derlemeyi adından türüne yükleyebilirsiniz - Type t = a.GetType("namespace.a.b.ClassName");
.
typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t) => t.FullName == youFullName);
sonuçta biraz güçlük çekebilirsiniz
Tür derleme nitelikli adı olmadan, ancak dll adı ile de alabilirsiniz, örneğin:
Type myClassType = Type.GetType("TypeName,DllName");
Aynı durum vardı ve benim için çalıştı. "DataModel.QueueObject" türünde bir nesneye ihtiyacım vardı ve aşağıdaki gibi türü var "DataModel" için bir başvuru vardı:
Type type = Type.GetType("DataModel.QueueObject,DataModel");
Virgülden sonraki ikinci dize referans adıdır (dll adı).
NamespaceTypeName, AssemblyNameSpec
burada AssemblyNameSpec
herhangi bir özelliği olmayan düzeneğin tanımlayıcısıdır. Bu cevap temelde aynı olsa da bunun toplanma özellikleri tanıtmak olduğunu "gürültü" (örneğin bazı ortadan kaldıran, çünkü bazı insanlar bu tercih farz kabul olarak Version
, Culture
PublicKeyToken
). Neyse ki, özellikler isteğe bağlıdır .
AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
bu yöntemi kullanmayı dene
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
Desteklenmediği için UWP için çalışmıyor . Alternatiflerden emin değilim.
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
Genel türün kaldırıldığını unutmayın.
Derleme bir ASP.NET uygulaması derlemesinin bir parçasıysa, BuildManager sınıfını kullanabilirsiniz:
using System.Web.Compilation
...
BuildManager.GetType(typeName, false);
sınıfınız geçerli olarak mevcut değilse nitelikliName vermelisiniz ve bu kod sınıfın nitelikli adını nasıl alacağınızı gösterir
string qualifiedName = typeof(YourClass).AssemblyQualifiedName;
ve daha sonra nitelikliName ile yazabilirsiniz
Type elementType = Type.GetType(qualifiedName);
Yuvalanmış bir Türse, a'yı dönüştürmeyi unutmuş olabilirsiniz. + 'ya
Ne olursa olsun, typeof( T).FullName
size ne söylemeniz gerektiğini söyleyecek
DÜZENLEME: BTW (bildiğiniz gibi emin) kullanımı derleyici yalnızca derleme yönergeleri vardır ve bu nedenle API çağrısının başarısı üzerinde herhangi bir etkisi olamaz. (Potansiyel olarak etkisi olabilecek proje veya montaj referanslarınız varsa - bu nedenle bilgi işe yaramaz, sadece bazı filtreleme gerektirir ...)
+
Kullanıcının veritabanında belirtilen kullanıcı denetimine bağlı olarak kullanıcı denetimlerini açıyorum. Bu yüzden TypeName almak için bu yöntemi kullandım ...
Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))
Böylece, bu nesnenin bir örneğini oluşturmak için strType'ta döndürülen değer kullanılabilir.
As Type.GetType (String) ihtiyaç Type.AssemblyQualifiedName kullanmanız gereken 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);
Sürüm, Kültür ve PublicKeyToken aşağıdakiler için gerekli değildir assemblyName
nedenle MyAssembly.GetName () işlevini kullanabilmeniz .
Hakkında Type.GetType (dize) :
Tür, şu anda yürütülen derlemede veya Mscorlib.dll dosyasındaysa, ad alanı tarafından nitelenen tür adını sağlamak yeterlidir.
Montaj bilgilerini içeren tam tür adını kullanmayı deneyin, örneğin:
string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);
Ben sadece namesspace.classname farklı bir derleme sınıf türünü almak için kullanırken aynı durum vardı ve işe yaramaz. Yalnızca yukarıda gösterildiği gibi tip dizgime montaj bilgilerini eklediğimde çalıştı.
Benim için anahtar "+" idi! Bu benim sınıfım (iç içe geçmiş):
namespace PortalServices
{
public class PortalManagement : WebService
{
public class Merchant
{}
}
}
ve bu kod satırı işe yaradı:
Type type = Type.GetType("PortalServices.PortalManagement+Merchant");
Yukarıdaki bu çözüm benim için en iyisi gibi görünüyor, ama benim için işe yaramadı, bu yüzden aşağıdaki gibi yaptım:
AssemblyName assemblyName = AssemblyName.GetAssemblyName(HttpContext.Current.Server.MapPath("~\\Bin\\AnotherAssembly.dll"));
string typeAssemblyQualifiedName = string.Join(", ", "MyNamespace.MyType", assemblyName.FullName);
Type myType = Type.GetType(typeAssemblyQualifiedName);
Önkoşul, montajın yolunu bilmenizdir. Benim durumumda bunu biliyorum, çünkü bu başka bir dahili projeden yapılmış bir derleme ve projemizin bin klasörüne dahil.
Önemli olması durumunda Visual Studio 2013 kullanıyorum, hedef .NET 4.0. Bu bir ASP.NET projesidir, bu yüzden mutlak yol alıyorum HttpContext
. Ancak, AssemblyQualifiedNames üzerindeki MSDN'den göründüğü gibi, mutlak yol bir zorunluluk değildir
Ben aldattım. Ben oluşturmak istediğiniz türleri (ada göre) hepsi bir dll ı denetiminde olduğundan, ben sadece basit bir ad alır derleme dll statik bir yöntem koymak ve bu bağlamdan type.GetType çağırır ve sonuç döndürür .
Orijinal amaç, türün yapılandırma verilerinde adla belirtilebilmesiydi. Ben beri kullanıcı işlemek için bir biçim belirtilen şekilde kodu değiştirmek ettik. Biçim işleyici sınıfları, türün belirtilen biçimi ayrışıp ayrıştıramayacağını belirleyen bir arabirim uygular. Daha sonra arabirimi uygulayan türleri bulmak ve yansımayı işleyen bir biçim bulmak için yansıma kullanın. Şimdi yapılandırma belirli bir tür değil, bir biçim adı belirtir. Yansıma kodu bitişik dll ve yük bakabilirsiniz, bu yüzden ben bir tür kötü adamın eklenti mimarisi var.