2014-09-01 13 views
6

Ho pensato a questo problema per un po 'e mi sembra che ci debba essere una soluzione semplice che mi manca.Costruttore corrispondente alla controparte nella definizione di tipo generico

Diciamo che ho la seguente classe:

public class Foo<T> 
{ 
    public Foo(T value) 
    { 
    } 

    public Foo(int value) 
    { 
    } 
} 

Se ottengo tutti i costruttori del tipo Foo<System.Int32> mi metterò di nuovo due costruttori, entrambi con un unico parametro di tipo System.Int32 che non può essere differenziato.

Se ottengo tutti i costruttori dalla definizione di tipo generico di Foo<System.Int32> (Foo<T>), restituirò due costruttori. Uno che accetta un parametro generico T e uno che accetta un parametro di tipo System.Int32

// Will return two constructors with signatures that look identical.  
var type = typeof(Foo<int>);  
var ctors1 = type.GetConstructors(); 

// Will return two constructors as well. Parameters can be differentiated. 
var genericTypeDefinition = typeof(Foo<int>).GetGenericTypeDefinition(); 
var ctors2 = genericTypeDefinition.GetConstructors(); 

C'è un modo per abbinare un costruttore per la sua controparte nella sua definizione di tipo generico?

risposta

2

Per confrontare il ctors in entrambi i casi è possibile confrontare il loro MetadataToken. Esempio:

foreach (var item in ctors1) 
{ 
    var ctorMatch = ctors2.SingleOrDefault(c => c.MetadataToken == item.MetadataToken); 
} 
+0

Wow. Molto più semplice di quanto pensassi. Grazie mille! – Patrik

+0

il benvenuto :) – terrybozzio

Problemi correlati