2009-02-23 29 views
37

Tôi có một bảng trong cơ sở dữ liệu mà tôi sử dụng để quản lý các mối quan hệ trên ứng dụng của mình. nó khá cơ bản trong tự nhiên của nó - parentType, parentId, childType, childId ... tất cả là ints. Tôi đã thực hiện thiết lập này trước đây, nhưng tôi đã làm nó với một chuyển đổi/trường hợp thiết lập khi tôi đã có 6 bảng khác nhau tôi đã cố gắng để liên kết. Bây giờ tôi có 30 bảng mà tôi đang cố gắng để làm điều này với và tôi muốn để có thể làm điều này mà không cần phải viết 30 trường hợp mục trong lệnh chuyển đổi của tôi.Tự động tạo một đối tượng của <Type>

Có cách nào để tôi có thể tham chiếu đến lớp .Net bằng chuỗi không? Tôi biết điều này không hợp lệ (vì tôi đã thử một số biến thể của điều này):

Type t = Type.GetType("WebCore.Models.Page"); 
object page = new t(); 

Tôi biết cách sử dụng Loại đối tượng, nhưng làm cách nào để sử dụng tính năng này để tạo mới vật?

Trả lời

49

Liên kết này sẽ giúp:

http://msdn.microsoft.com/en-us/library/system.activator.createinstance(VS.71).aspx

Activator.CreateInstance sẽ tạo ra một thể hiện của các loại quy định.

bạn có thể bọc trong một phương pháp chung chung như thế này:

public T GetInstance<T>(string type) 
{ 
    return (T)Activator.CreateInstance(Type.GetType(type)); 
} 
+2

Điều này sẽ không hoạt động nếu lắp ráp chứa loại chưa được tải vào AppDomain. –

+3

Ngoài ra để gọi phương thức đó thì OP phải có quyền truy cập vào kiểu tại thời gian biên dịch - câu hỏi ban đầu được hỏi làm thế nào để tạo một cá thể tại thời gian thực hiện từ một chuỗi. –

+0

tôi chỉ dựa vào câu trả lời của tôi trên ví dụ được cung cấp trong câu hỏi. –

9

Bạn muốn sử dụng Activator.CreateInstance.

Dưới đây là một ví dụ về cách thức hoạt động:

using System; 
using System.Runtime.Remoting; 

class Program 
{ 
    static void Main() 
    { 
     ObjectHandle o = Activator.CreateInstance("mscorlib.dll", "System.Int32"); 

     Int32 i = (Int32)o.Unwrap(); 
    } 
} 
11

Nếu loại được biết đến bởi người gọi, có một, cách tốt hơn nhanh hơn so với sử dụng Activator.CreateInstance: bạn có thể sử dụng thay vì một hạn chế chung trên phương thức xác định nó có một hàm tạo parameterless mặc định.

Làm theo cách này an toàn và không cần phản ánh.

T CreateType<T>() where T : new() 
{ 
    return new T(); 
} 
+6

Nó không đòi hỏi sự phản chiếu ở mức mã nguồn - nó sử dụng Activator.CreateInstance trong IL được tạo ra. Yêu cầu phản ánh –

+1

vì OP được chỉ định bằng chuỗi để xác định Loại. –

0

Giả sử bạn có các loại sau đây:

public class Counter<T> 
{ 
    public T Value { get; set; } 
} 

và có tên lắp ráp đủ của các loại, bạn có thể xây dựng nó theo cách sau đây:

string typeName = typeof(Counter<>).AssemblyQualifiedName; 
Type t = Type.GetType(typeName); 

Counter<int> counter = 
    (Counter<int>)Activator.CreateInstance(
    t.MakeGenericType(typeof(int))); 

counter.Value++; 
Console.WriteLine(counter.Value); 
8
public static T GetInstance<T>(params object[] args) 
{ 
    return (T)Activator.CreateInstance(typeof(T), args); 
} 

Tôi sẽ sử dụng Activator.CreateInstance() thay vì truyền, như Trình kích hoạt h như một nhà xây dựng cho Generics.

1

Đây là hàm tôi đã sao chép bản ghi loại T, sử dụng sự phản chiếu. Đây là một thực hiện rất đơn giản, tôi không xử lý các loại phức tạp, vv

public static T Clone<T>(T original) 
    { 
     T newObject = (T)Activator.CreateInstance(original.GetType()); 

     foreach (var prop in original.GetType().GetProperties()) 
     { 
      prop.SetValue(newObject, prop.GetValue(original)); 
     } 

     return newObject; 
    } 

Tôi hy vọng điều này có thể giúp ai đó.

Assaf

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