รหัสนี้:
Type.GetType("namespace.a.b.ClassName")
null
ผลตอบแทน
และฉันมีในการใช้:
using namespace.a.b;
ปรับปรุง:
มีชนิดอยู่ในไลบรารีคลาสอื่นและฉันต้องการได้โดยใช้ชื่อสตริง
รหัสนี้:
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")
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");
สตริงที่สองหลังเครื่องหมายจุลภาคคือชื่ออ้างอิง (ชื่อ 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
ไม่รองรับ ไม่แน่ใจในทางเลือกใด ๆ
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
ประเภททั่วไปถูกถอดออก
หากแอสเซมบลีเป็นส่วนหนึ่งของบิลด์ของแอปพลิเคชัน ASP.NET คุณสามารถใช้คลาส BuildManager ได้:
using System.Web.Compilation
...
BuildManager.GetType(typeName, false);
หากคลาสของคุณไม่ได้อยู่ใน assambly ปัจจุบันคุณต้องให้ชื่อที่ผ่านการรับรองและรหัสนี้จะแสดงวิธีรับชื่อที่ผ่านการรับรองของคลาส
string qualifiedName = typeof(YourClass).AssemblyQualifiedName;
จากนั้นคุณจะได้รับประเภทที่ผ่านการรับรองชื่อ
Type elementType = Type.GetType(qualifiedName);
หากเป็นประเภทที่ซ้อนกันคุณอาจลืมแปลง เพื่อ +
โดยไม่คำนึงถึง typeof( T).FullName
จะบอกอะไรคุณควรพูด
แก้ไข: BTW การใช้งาน (ตามที่ฉันแน่ใจว่าคุณรู้) เป็นเพียงคำสั่งให้รวบรวมในเวลารวบรวมและดังนั้นจึงไม่สามารถมีผลกระทบใด ๆ กับความสำเร็จของการเรียก 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();
ในฐานะที่เป็น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);
ไม่จำเป็นต้องใช้เวอร์ชัน, วัฒนธรรมและ PublicKeyToken เพื่อassemblyName
ให้คุณสามารถใช้ MyAssembly.GetName ()
เกี่ยวกับType.GetType (สตริง) :
ถ้าชนิดอยู่ในแอสเซมบลีที่กำลังดำเนินการอยู่ในปัจจุบันหรือใน Mscorlib.dll มันก็เพียงพอที่จะระบุชื่อชนิดที่มีคุณสมบัติตาม namespace
หากมีการอ้างอิงแอสเซมบลีและคลาสที่มองเห็นได้:
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)
ฉันนิ่งงันอยู่สองสามวันกับสิ่งนี้
สำหรับฉัน "+" คือกุญแจ! นี่คือชั้นเรียนของฉัน (เป็นชั้นซ้อน):
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);
เงื่อนไขเบื้องต้นคือคุณรู้เส้นทางของการชุมนุม ในกรณีของฉันฉันรู้เพราะนี่คือการชุมนุมที่สร้างขึ้นจากโครงการภายในอื่นและรวมอยู่ในโฟลเดอร์ถังขยะของโครงการของเรา
ในกรณีที่ฉันใช้ Visual Studio 2013 เป้าหมายของฉันคือ. NET 4.0 นี้เป็นโครงการที่ ASP.NET HttpContext
ดังนั้นฉันได้รับผ่านเส้นทางที่แน่นอน อย่างไรก็ตามเส้นทางแบบสัมบูรณ์ไม่ใช่ข้อกำหนดตามที่ดูเหมือนจากMSDN บน AssemblyQualifiedNames
ฉันโกง เนื่องจากประเภทที่ฉันต้องการสร้าง (ตามชื่อ) ล้วนอยู่ในใน dll ที่ฉันควบคุมฉันเพิ่งใส่วิธีแบบคงที่ใน dll ในแอสเซมบลีที่ใช้ชื่อแบบง่ายและเรียกใช้ type.GetType จากบริบทนั้นและส่งกลับผลลัพธ์ .
วัตถุประสงค์ดั้งเดิมคือเพื่อให้สามารถระบุประเภทตามชื่อในข้อมูลการกำหนดค่า ฉันได้เปลี่ยนรหัสเพื่อให้ผู้ใช้ระบุรูปแบบที่จะดำเนินการ คลาสตัวจัดการรูปแบบใช้อินเตอร์เฟสที่กำหนดว่าชนิดสามารถวิเคราะห์รูปแบบที่ระบุได้หรือไม่ ฉันใช้การสะท้อนเพื่อค้นหาชนิดที่ใช้อินเทอร์เฟซและค้นหาชนิดที่จัดการรูปแบบ ดังนั้นตอนนี้การกำหนดค่าจะระบุชื่อรูปแบบไม่ใช่ประเภทเฉพาะ รหัสสะท้อนสามารถดูที่กำลังติดตั้งและโหลดได้ดังนั้นฉันจึงมีสถาปัตยกรรมปลั๊กอินของคนจนเรียงลำดับ