2009-06-04 31 views
7

Tôi biết điều này không có tác dụng, tuy nhiên có ai có cách làm cho nó hoạt động không?Nhập động bằng C#

object obj = new object(); 
MyType typObj = new MyType(); 
obj = typObj; 
Type objType = typObj.GetType(); 
List<objType> list = new List<objType>(); 
list.add((objType) obj); 

EDIT:

Đây là mã hiện tại: http://github.com/vimae/Nisme/blob/4aa18943214a7fd4ec6585384d167b10f0f81029/Lala.API/XmlParser.cs

Phương pháp Tôi đang cố gắng để sắp xếp là SingleNodeCollection

Như bạn có thể thấy, nó hiện đang sử dụng để hack cùng phản ánh phương pháp.

+2

gì bạn đang cố gắng làm gì? –

+0

bạn đang cố gắng đạt được điều gì? –

+2

@Daniel: Có vẻ như anh ấy đang cố gắng tạo danh sách loại đối tượng đã tồn tại. – Welbog

Trả lời

10

Có vẻ như bạn đang bỏ lỡ một giải pháp rõ ràng:

object obj = new object(); 
MyType typObj = new MyType(); 
obj = typObj; 
List<MyType> list = new List<MyType>(); 
list.Add((MyType) obj); 

Nếu bạn thực sự cần con đường năng động, sau đó bạn có thể làm một cái gì đó như thế này:

object obj = new object(); 
MyType typObj = new MyType(); 
obj = typObj; 
Type objType = typObj.GetType(); 

Type listType = typeof(List<>); 
Type creatableList = listType.MakeGenericType(objType); 

object list = Activator.CreateInstance(creatableList); 
MethodInfo mi = creatableList.GetMethod("Add"); 
mi.Invoke(list, new object[] {obj}); 
+0

Đây có phải là chỉ trong .Net 3.5? – Skizz

+0

Không, 2.0 trở lên. –

+0

Đoạn mã nhỏ, vừa giải quyết được vấn đề cho tôi. :) –

1

Bạn cần phản ánh:

constructor = typeof (MyType).GetConstructor() // doing this from memory, the typeof might be wrong, I'm sure someone will edit it 
typObj = (MyType) constructor.Invoke() 

Nó cũng có thể được thực hiện cho Generics nhưng đó là một chút phức tạp hơn.

1

Bạn có thể làm một cái gì đó như thế này bằng cách sử dụng Generics, tôi không thực sự chắc chắn những gì điểm của nó sẽ được mặc dù.

public List<T> TypedList<T>() where T : new() 
{ 
    object obj = new object(); 
    T typObj = new T(); 
    obj = typObj; 
    List<T> list = new List<T>(); 
    list.Add((T)obj); 
    return list; 
} 
0
object obj = new object(); 
Type objType = obj.GetType(); 
IList list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(objType)); 
list.Add(obj); 

Với điều này, bạn sẽ nhận được một lỗi thời gian chạy nếu bạn cố gắng đặt cái gì đó vào danh sách đó không phải là chuyển nhượng từ ObjType.

-2

Tôi không hoàn toàn chắc chắn những gì bạn đang cố gắng để làm, nhưng sẽ làm việc này:

var obj = new MyType();

tôi có thể hiểu lầm câu hỏi của bạn mặc dù.

(Tôi thay đổi nội dung này để sửa mẫu mã mà sẽ không biên dịch, cảm ơn cho bình luận)

+0

var obj; là một tuyên bố không hợp lệ. var là một từ khóa ngầm, có nghĩa là trình biên dịch sẽ xác định loại đó là gì. Với câu lệnh var obj; trình biên dịch sẽ không có đủ thông tin để xác định loại. –

0

nhanh hơn sẽ được sử dụng Reflection.Emit Here's một ví dụ đơn giản của việc sử dụng Reflection.Emit cho instantiating một bê tông tùy ý gõ vào thời gian chạy. Vì mục đích của bạn, bạn chỉ cần gọi nó là ctor of List thay vì T.ctor như trong ví dụ.

0

Mặc dù nó dường như đã trả lời, tôi vẫn không nhận được nó :)

Nó sẽ không thể hữu ích để có những "typeToReturn" như là đối số chung để chức năng?

public List<T> SingleNodeCollection<T>(String xPath, XPathNavigator navigator) 
    where T : new() 
{ 
    XPathNodeIterator nodes = navigator.Select(xPath); 
    List<T> returnedList = new List<T>(nodes.Count); 
    ... 
    T newObj = new T(); 
    ... 
    Type t = typeof(T); // need the type anyway? 
} 
0
public class myClass 
    { 
    } 

    myClass instance = new myClass(); 

    Type t = instance.GetType; 

// đầu chỉ là để cho thấy được một loại ...

public object GetListOfType(Type t) 
{ 
    Type listType = typeof(List<>); 
    var listOfType = listType.MakeGenericType(t); 

    var listOfMyClassInstance = Activator.CreateInstance(listOfType); 

    return listOfMyClassInstance; 
} 

nhưng cuối cùng bạn phải bỏ ... sử dụng loại trực tiếp

List<object> listOfMyClass = GetListOfType(t); 
    listOfMyClass.Add(myClassInstance); 

    ((myClass)listOfMyClass[0]).SomeProperty 
Các vấn đề liên quan