Mã này:
Type.GetType("namespace.a.b.ClassName")
trả lại null
.
và tôi có trong các ứng dụng:
using namespace.a.b;
Cập nhật:
Kiểu tồn tại, nó nằm trong một thư viện lớp khác và tôi cần lấy nó theo tên chuỗi.
Mã này:
Type.GetType("namespace.a.b.ClassName")
trả lại null
.
và tôi có trong các ứng dụng:
using namespace.a.b;
Cập nhật:
Kiểu tồn tại, nó nằm trong một thư viện lớp khác và tôi cần lấy nó theo tên chuỗi.
Câu trả lời:
Type.GetType("namespace.qualified.TypeName")
chỉ hoạt động khi loại được tìm thấy trong mscorlib.dll hoặc lắp ráp hiện đang thực thi.
Nếu cả hai điều này đều không đúng, bạn sẽ cần một tên đủ điều kiện lắp ráp :
Type.GetType("namespace.qualified.TypeName, Assembly.Name")
Assembly a = Assembly.Load("SomeLibrary");
- và sau đó tải loại theo tên từ cụm - Type t = a.GetType("namespace.a.b.ClassName");
.
typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t) => t.FullName == youFullName);
tiết kiệm một số rắc rối, cuối cùng
Bạn cũng có thể lấy loại không có tên đủ điều kiện lắp ráp nhưng với tên dll cũng có, ví dụ:
Type myClassType = Type.GetType("TypeName,DllName");
Tôi đã có tình huống tương tự và nó đã làm việc cho tôi. Tôi cần một đối tượng thuộc loại "DataModel.QueueObject" và có một tham chiếu đến "DataModel" vì vậy tôi có loại như sau:
Type type = Type.GetType("DataModel.QueueObject,DataModel");
Chuỗi thứ hai sau dấu phẩy là tên tham chiếu (tên dll).
NamespaceTypeName, AssemblyNameSpec
nơi AssemblyNameSpec
định danh của lắp ráp mà không có thuộc tính nào. Mặc dù câu trả lời này là về cơ bản giống như chấp nhận tôi cho rằng một số người thích điều này vì nó không đi với một số trong những "tiếng ồn" mà các thuộc tính lắp ráp giới thiệu (ví dụ Version
, Culture
PublicKeyToken
). May mắn thay, các thuộc tính là tùy chọn .
AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
thử sử dụng phương pháp này
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
không được hỗ trợ. Không chắc chắn về bất kỳ lựa chọn thay thế.
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
loại chung được loại bỏ.
Nếu tập hợp là một phần của quá trình xây dựng ứng dụng ASP.NET, bạn có thể sử dụng lớp BuildManager:
using System.Web.Compilation
...
BuildManager.GetType(typeName, false);
nếu lớp của bạn không có trong assambly hiện tại, bạn phải cung cấp QualName và mã này cho biết làm thế nào để có được tên của lớp
string qualifiedName = typeof(YourClass).AssemblyQualifiedName;
và sau đó bạn có thể nhận được loại với QualName
Type elementType = Type.GetType(qualifiedName);
Nếu đó là Loại lồng nhau, bạn có thể quên chuyển đổi a. đến một +
Bất kể, typeof( T).FullName
sẽ cho bạn biết những gì bạn nên nói
EDIT: BTW các cách sử dụng (như tôi chắc chắn bạn biết) chỉ là các chỉ thị cho trình biên dịch tại thời điểm biên dịch và do đó không thể có bất kỳ tác động nào đến thành công của lệnh gọi API. (Nếu bạn có tài liệu tham khảo dự án hoặc lắp ráp, điều đó có khả năng có ảnh hưởng - do đó thông tin không vô dụng, nó chỉ cần một số bộ lọc ...)
+
dấu phân cách)
Tôi đang mở các điều khiển người dùng tùy thuộc vào những gì người dùng kiểm soát mà người dùng có quyền truy cập được chỉ định trong cơ sở dữ liệu. Vì vậy, tôi đã sử dụng phương thức này để lấy TypeName ...
Dim strType As String = GetType(Namespace.ClassName).AssemblyQualifiedName.ToString
Dim obj As UserControl = Activator.CreateInstance(Type.GetType(strType))
Vì vậy, bây giờ người ta có thể sử dụng giá trị được trả về trong strType để tạo một thể hiện của đối tượng đó.
Vì Type.GetType (Chuỗi) cần Type.AssuggingQualifiedName, bạn nên sử dụng Association.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);
Phiên bản, Văn hóa và PublicKeyToken không bắt buộc vì assemblyName
đó là lý do tại sao bạn có thể sử dụng MyAssugging.GetName (). Name.
Giới thiệu về Type.GetType (Chuỗi) :
Nếu loại nằm trong hội đồng hiện đang thực thi hoặc trong Mscorlib.dll, thì việc cung cấp tên loại đủ điều kiện theo không gian tên của nó là đủ.
Hãy thử sử dụng tên loại đầy đủ bao gồm thông tin lắp ráp, ví dụ:
string typeName = @"MyCompany.MyApp.MyDomain.MyClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
Type myClassType = Type.GetType(typeName);
Tôi đã gặp tình huống tương tự khi tôi chỉ sử dụng tên namesspace. Classname để lấy loại lớp trong một cụm khác và nó sẽ không hoạt động. Chỉ hoạt động khi tôi bao gồm thông tin lắp ráp trong chuỗi loại của tôi như được hiển thị ở trên.
Đối với tôi, "+" là chìa khóa! Đây là lớp học của tôi (nó là một lớp lồng nhau):
namespace PortalServices
{
public class PortalManagement : WebService
{
public class Merchant
{}
}
}
và dòng mã này đã hoạt động:
Type type = Type.GetType("PortalServices.PortalManagement+Merchant");
Giải pháp này ở trên có vẻ là tốt nhất đối với tôi, nhưng nó không hiệu quả với tôi, vì vậy tôi đã làm như sau:
AssemblyName assemblyName = AssemblyName.GetAssemblyName(HttpContext.Current.Server.MapPath("~\\Bin\\AnotherAssembly.dll"));
string typeAssemblyQualifiedName = string.Join(", ", "MyNamespace.MyType", assemblyName.FullName);
Type myType = Type.GetType(typeAssemblyQualifiedName);
Điều kiện tiên quyết là bạn biết đường dẫn của lắp ráp. Trong trường hợp của tôi, tôi biết điều đó bởi vì đây là một hội đồng được xây dựng từ một dự án nội bộ khác và nó được bao gồm trong thư mục bin của dự án của chúng tôi.
Trong trường hợp có vấn đề tôi đang sử dụng Visual Studio 2013, .NET mục tiêu của tôi là 4.0. Đây là một dự án ASP.NET, vì vậy tôi nhận được đường dẫn tuyệt đối thông qua HttpContext
. Tuy nhiên, đường dẫn tuyệt đối không phải là một yêu cầu vì có vẻ như từ MSDN trên AssociationQualifiedNames
Tôi đã lừa dối. Vì các loại tôi muốn tạo (theo tên) đều nằm trong một dll tôi điều khiển, tôi chỉ cần đặt một phương thức tĩnh trong dll trong cụm có một tên đơn giản và gọi type.GetType từ ngữ cảnh đó và trả về kết quả .
Mục đích ban đầu là để loại có thể được chỉ định theo tên trong dữ liệu cấu hình. Kể từ khi tôi thay đổi mã để người dùng chỉ định một định dạng cần xử lý. Các lớp xử lý định dạng thực hiện một giao diện xác định xem loại có thể phân tích định dạng được chỉ định hay không. Sau đó tôi sử dụng sự phản chiếu để tìm các kiểu thực hiện giao diện và tìm một kiểu xử lý định dạng. Vì vậy, bây giờ cấu hình chỉ định một tên định dạng, không phải là một loại cụ thể. Mã phản chiếu có thể nhìn vào các dll liền kề và tải, vì vậy tôi có kiến trúc trình cắm thêm của một người nghèo.