2011-11-21 29 views
6

Tôi cần phải có được một thể hiện của một loại có tên và tên lắp ráp tôi sẽ có trong thời gian chạy. Tôi biết trước các loại sẽ có một constructor parameterless. Cách dễ nhất để làm điều này là gì?Làm thế nào để tải một loại từ tên của loại và tên của hội đồng

Đó là waaaaaaay khó hơn tôi mong đợi.

Chỉnh sửa: Tôi không nếu điều này có liên quan, nhưng hội đồng sẽ được tham chiếu. Tôi không cần tải nó từ đĩa hay gì đó.

Trả lời

2

Sau đây là đủ:

var assmebly = Assembly.Load("FullyQualifiedAssemblyName"); 
var type = assmebly.GetType("FullTypeName"); 
var instance = Activator.CreateInstance(type); 
5

Từ MSDN:

Activator.CreateInstance Method (String, String)

Tạo một thể hiện của loại tên được quy định , bằng cách sử dụng assembly được đặt tên và constructor mặc định.

public static ObjectHandle CreateInstance(
    string assemblyName, 
    string typeName 
) 

Ví dụ:

var assemblyName = 
    "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; 

var typeName = "System.Net.WebClient"; 

var instance = Activator.CreateInstance(assemblyName, typeName).Unwrap(); 
+0

Tôi đã thử điều đó và có vấn đề với nó, do đó câu hỏi của tôi. – David

+0

@David: Vấn đề là gì? Tôi đã thêm một ví dụ làm việc; cái đó có giúp ích không? – dtb

+1

Có thể nó không hoạt động vì tôi không chỉ định Phiên bản, Văn hóa và PublicKeyToken cho hội đồng. Nhưng không phải ví dụ dường như làm điều này. – David

2
Type referencedType = typeof(AReferencedType); 
AReferencedType instance = Activator.CreateInstance<AReferencedType>(); 

or 

Type type = Type.GetType("Type's full name"); 
object instance = Activator.CreateInstance(type); 
+0

Trong đoạn thứ hai, không GetType cũng không yêu cầu tên của hội đồng? Tôi nghĩ là vậy. – David

+0

@David, không phải nếu bạn sử dụng tên loại đủ điều kiện http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx –

+0

Vâng, loại đó cần tên của hội đồng. Dù sao, tất cả đều tốt. – David

3

Nếu tham khảo System.Web.dll không phải là một vấn đề cho bạn, đó là l được biết đến một cách tinh tế BuildManager.GetType Method khá hiệu quả. Nó thậm chí không yêu cầu tên assembly vì nó quét các kiểu trong các assembly trong đường dẫn thực thi AppDomain hiện tại.

Vì vậy, các mã sẽ là:

object instance = Activator.CreateInstance(BuildManager.GetType("MyNamespace.MyClass", true)); 
+0

Thực sự ít được biết đến. Cảm ơn vì tiền hỗ trợ. – David

+0

Rất hữu ích và tiện dụng. Sẽ hữu ích hơn nếu lõi> _ < – user2864740

2
Activator.CreateInstance(Type.GetType("System.Int32")); 

Activator

Type

+0

Tôi chỉ có tên của hội đồng và lớp học khi chạy. – David

1

Dưới đây là một cái gì đó mà làm việc bằng cách sử dụng ưa thích dynamic từ khóa. Bạn sẽ cần phải tham khảo lớp khác để kiểm tra để vượt qua, hoặc sử dụng một sự kiện xây dựng để sao chép qua DLL được xây dựng.

namespace TestLibrary 
{ 
    [TestFixture] 
    public class Tests 
    { 
     [Test] 
     public void FileCheck() 
     { 
      dynamic otherClass = 
       AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap("OtherLibrary.dll",     
        "Prefix.OtherLibrary.SomeClass"); 
      otherClass.SayHello(); // look, ma! no casting or interfaces! 
     } 
    } 
} 

namespace Prefix.OtherLibrary 
{ 
    public class SomeClass 
    { 
     public void SayHello() 
     { 
      Console.WriteLine("Hello, world."); 
     } 
    } 
} 

Không giống như Activator, AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap mất một filename như là đối số đầu tiên chứ không phải là xác định kiểu. Điều này đôi khi hữu ích, đặc biệt là khi bạn không quan tâm đến tên mạnh của hội đồng.

+0

Cách tiếp cận thú vị. Tôi có biết bạn không? – David

Các vấn đề liên quan