2012-05-03 3 views
6

У меня есть этот метод:Как вы называете общий метод, если знаете только параметр типа во время выполнения?

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

Так что я хочу назвать эту SomeMethod, который хорошо, если я знаю, тип:

SomeMethod<Class1>(); 

Но если я только Class1 во время выполнения я не могу назови это?

А как позвонить SomeMethod с неизвестным типом? Я получил Тип, используя отражение.

У меня Тип Тип но SomeMethod<Type | GetType()> не работает.

Update 7 мая:

Вот пример кода, что я хочу добиться:

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 }; 
     } 
    } 
} 

Это демонстрационный вынимают из большего контекста.

+3

SLaks ответил на ваш вопрос хорошо. Я просто замечаю, что вы неправильно использовали слово «анонимный», что означает что-то другое. В вашем случае T является общим. – SimpleVar

+0

Это ваш вызов API или какой-то сторонний API? Если это ваше, то подумайте об изменении, потому что дженерики не решают проблему, а создают ее в этом случае. – empi

+1

Возможный дубликат [Вызов универсального метода с аргументом типа, известным только во время выполнения] (http://stackoverflow.com/questions/325156/calling-generic-method-with-a-type-argument-known-only-at -execution-time) – user7116

ответ

8

Вы должны вызвать его с помощью отражения:

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

Речь идет не о вызове неизвестного метода, а о его параметре, который я не знаю до времени выполнения. Например. если это Class1 или Class2, и т. д. – bluee

+0

SLaks и sixlettervariables доставили меня в правильном направлении. Спасибо, парни! – bluee

2

Вы можете использовать dynamic ключевое слово в C# 4. Вам требуется .NET 4.0 или выше, а также .:

SomeMethod((dynamic)obj); 

Среда аргумент фактического типа и делает вызов. Он терпит неудачу, если obj имеет значение null, так как информация о типе отсутствует. null в C# не имеет типа.