2009-03-15 53 views
10

Tôi đang đọc thông tin từ một XML chứa kiểu của một đối tượng mà tôi cần để khởi tạo cùng với các tham số hàm tạo của nó.Làm cách nào để tạo một thể hiện từ một chuỗi trong C#?

Loại đối tượng thực sự là trong một dự án khác, trong một không gian tên anh chị em. (Tôi cần phải tạo một Company.Project2.Type trong lớp Company.Project1.)

Tôi tìm thấy this question, nhưng nó không xử lý các tham số của hàm tạo hoặc thực tế là nó nằm trong một không gian tên khác.

Tôi làm cách nào để thực hiện việc này?

Chỉnh sửa: Tên lắp ráp và không gian tên mặc định không được đặt chính xác trong thuộc tính dự án.

Trả lời

29
  • Bạn cần chỉ định tên đầy đủ cho Type.GetType(), bao gồm cả không gian tên, ví dụ: "Company.Project2.Type"
  • Nếu loại không nằm trong cùng một assembly (hoặc mscorlib), bạn cũng cần cung cấp tên assembly, bao gồm thông tin phiên bản nếu nó được gõ mạnh. Ví dụ, đối với một assembly không được đánh máy mạnh Company.Project2.dll, bạn có thể chỉ định "Company.Project2.Type, Company.Project2".
  • Để gọi một hàm tạo với các tham số bạn có thể gọi Activator.CreateInstance(Type, Object[]) hoặc nhận hàm tạo chính xác bạn muốn với Type.GetConstructor() và sau đó gọi ConstructorInfo.Invoke().

Nếu điều đó không có tác dụng, vui lòng cung cấp thêm thông tin.

+0

Loại.GetType() dường như không tìm thấy loại có chuỗi mà tôi cung cấp. Lớp Prop được định nghĩa trong không gian tên Reaver.GamePlay, nhưng kiểu trả về là null. –

+0

Tôi cũng đã thử "Reaver.GamePlay.Prop, Reaver.GamePlay" để không có kết quả. –

+0

@Ben: Lắp ráp là gì? Là lắp ráp mạnh mẽ đánh máy? –

2

Nếu bạn muốn tạo kiểu động tại thời gian chạy, Activator.CreateInstance Method sẽ làm điều đó cho bạn. Nếu bạn gặp vấn đề với kiểu có một hàm tạo với các tham số, quá tải này sẽ làm điều này. Ví dụ: http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx

Tôi khuyên bạn nên xem qua các tình trạng quá tải để phù hợp nhất.

Sự cố không gian tên không nên có relavant - miễn là dll nằm trong thư mục bin hoặc GAC, bạn nên OK. Các quy tắc có thể thay đổi nếu hội đồng được đặt tên mạnh.

Bạn có thể cung cấp đoạn mã của mã không hoạt động (sử dụng phương pháp bạn đã liên kết) không? Điều này + các lỗi bạn đang thấy sẽ rất hữu ích! [cập nhật] Mẫu nhanh bằng cách sử dụng Activator.CreateInstance xử lý Constructors w/paramaters.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      BaseProduct b =(BaseProduct)System.Activator.CreateInstance(Type.GetType("ConsoleApplication1.Product") 
       ,new object[]{typeof(string)}, 
       new object[]{"123"} 
      ); 
      //Activator..::.CreateInstance Method (Type, array<Object>[]()[], array<Object>[]()[]) 
     } 
    } 
    public class Product: BaseProduct{ 
     public Product(string id) { 

     } 
     public string Id {get;set;} 


    } 

    public abstract class BaseProduct { 
     abstract public string Id { get; set; } 
    } 
} 
Các vấn đề liên quan