2012-05-03 25 views
6

tôi có phương pháp này:Làm cách nào để gọi một phương thức chung nếu bạn chỉ biết tham số kiểu khi chạy?

public List<T> SomeMethod<T>(params) where T : new() 

Vì vậy, tôi muốn gọi SomeMethod này đó là tốt nếu tôi biết loại:

SomeMethod<Class1>(); 

Nhưng nếu tôi chỉ có Class1 khi chạy Tôi không thể gọi nó đi?

Vậy làm thế nào để gọi SomeMethod với loại T không xác định? Tôi đã gõ bằng cách sử dụng sự phản chiếu.

Tôi có Loại loại nhưng SomeMethod<Type | GetType()> không hoạt động.

Cập nhật 7. tháng:

Dưới đây là một số mẫu mã của những gì tôi muốn đạt được:

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

namespace ConsoleApplication63 
{ 
    public class DummyClass 
    { 
    } 

    public class Class1 
    { 
     public string Name; 
    } 

    class AssemblyTypesReflection 
    { 
     static void Main(string[] args) 
     { 
      object obj = new Class1() { Name = "John" } ; 

      Assembly assembly = Assembly.GetExecutingAssembly(); 
      var AsmClass1 = (from i in assembly.GetTypes() where i.Name == "Class1" select i).FirstOrDefault(); 


      var list = SomeMethod<AsmClass1>((AsmClass1)obj); //Here it fails 
     } 

     static List<T> SomeMethod<T>(T obj) where T : new() 
     { 
      return new List<T> { obj }; 
     } 
    } 
} 

Đây là một bản demo đưa ra khỏi một bối cảnh lớn hơn.

+3

SLaks đã trả lời câu hỏi của bạn tốt. Tôi chỉ chú ý đến bạn rằng bạn đã lạm dụng từ ngữ 'ẩn danh' ở đây, có nghĩa là điều gì đó khác biệt. Trong trường hợp của bạn, T là chung chung. – SimpleVar

+0

Đây có phải là cuộc gọi API của bạn hoặc API của bên thứ ba không? Nếu nó là của bạn thì hãy xem xét thay đổi nó, bởi vì generics không giải quyết vấn đề nhưng tạo ra nó trong trường hợp này. – empi

+1

có thể trùng lặp của [Gọi phương thức chung với một đối số kiểu chỉ được biết đến tại thời điểm thực hiện] (http://stackoverflow.com/questions/325156/calling-generic-method-with-a-type-argument-known-only-at -execution-time) – user7116

Trả lời

8

Bạn cần phải gọi nó là sử dụng phản ánh:

var method = typeof(SomeClass).GetMethod("SomeMethod"); 
method.MakeGenericMethod(someType).Invoke(...); 
+0

Nó không phải là về việc gọi một phương thức chưa biết nhưng nó là tham số mà tôi không biết cho đến khi chạy. Ví dụ. nếu đó là Class1 hoặc Class2, vv .. – bluee

+0

SLaks và sixlettervariables đã cho tôi đi đúng hướng. Cảm ơn các bạn! – bluee

2

Bạn có thể tận dụng dynamic từ khóa trong C# 4. Bạn yêu cầu .NET 4.0 hoặc cao hơn cũng .:

SomeMethod((dynamic)obj); 

Thời gian chạy infers các đối số loại thực tế và thực hiện cuộc gọi. Không thành công nếu obj là null kể từ đó không có thông tin loại nào còn lại. null trong C# không có loại.

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