2012-05-03 6 views
6

mam tej metody:Jak wywołujesz metodę ogólną, jeśli znasz tylko parametr typu w środowisku wykonawczym?

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

więc chcę nazwać SomeMethod co jest w porządku, jeśli wiem, typ:

SomeMethod<Class1>(); 

Ale jeśli mam tylko Class1 przy starcie jestem w stanie nazwać?

Jak zatem zadzwonić pod numer SomeMethod z nieznanym typem T? Dostałem Type za pomocą refleksji.

Posiadam Typ, ale SomeMethod<Type | GetType()> nie działa.

Aktualizacja 7. maja:

Oto przykładowy kod, co chcę osiągnąć:

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

To demo wyjęte z większego kontekstu.

+3

SLAKS odpowiedział na twoje pytanie dobrze. Po prostu zwracam uwagę, że niewłaściwie użyłeś tu słowa "anonimowy", co oznacza coś innego. W twoim przypadku T ma charakter ogólny. – SimpleVar

+0

Czy to jest połączenie API lub API innej firmy? Jeśli jest to twoje, rozważ zmianę, ponieważ generics nie rozwiązuje problemu, ale utwórz go w tym przypadku. – empi

+1

możliwy duplikat [Wywołanie metody ogólnej z argumentem typu znanym tylko w czasie wykonywania] (http://stackoverflow.com/questions/325156/calling-generic-method-with-a-type-argument-known-only-at -ekspozycja-czas) – user7116

Odpowiedz

8

Trzeba nazwać używając odbicie:

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

Nie chodzi o wywołanie nieznanej metody, ale jest to parametr, którego nie znam do czasu wykonania. Na przykład. jeśli chodzi o Class1 lub Class2, itd. – bluee

+0

SLaksy i sześciocylindrowe zmienne doprowadziły mnie w dobrym kierunku. Dzięki chłopaki! – bluee

2

Można skorzystać z dynamic słów kluczowych w języku C# 4. wymagany jest .NET 4.0 lub nowszy oraz .:

SomeMethod((dynamic)obj); 

Środowisko wykonawcze podaje rzeczywisty typ argumentu i wykonuje wywołanie. Nie powiedzie się, jeśli obj ma wartość null, ponieważ nie ma już informacji o typie. null w C# nie ma typu.

Powiązane problemy