2009-08-24 8 views
3

Disons que j'ai cette classe:C# PropertyInfo (générique)

class Test123<T> where T : struct 
{ 
    public Nullable<T> Test {get;set;} 
} 

et cette classe

class Test321 
{ 
    public Test123<int> Test {get;set;} 
} 

Donc le problème permet de dire que je veux créer un Test321 par réflexion et définir « Test "avec une valeur comment puis-je obtenir le type générique?

Répondre

13

Puisque vous commencez à partir de Test321, la meilleure façon d'obtenir le type est de la propriété:

Type type = typeof(Test321); 
object obj1 = Activator.CreateInstance(type); 
PropertyInfo prop1 = type.GetProperty("Test"); 
object obj2 = Activator.CreateInstance(prop1.PropertyType); 
PropertyInfo prop2 = prop1.PropertyType.GetProperty("Test"); 
prop2.SetValue(obj2, 123, null); 
prop1.SetValue(obj1, obj2, null); 

Ou voulez-vous dire vous voulez trouver le T?

Type t = prop1.PropertyType.GetGenericArguments()[0]; 
0

Cela devrait le faire plus ou moins. Je n'ai pas accès à Visual Studio maintenant, mais cela pourrait vous donner une idée de la façon d'instancier le type générique et de définir la propriété.

// Define the generic type. 
var generic = typeof(Test123<>); 

// Specify the type used by the generic type. 
var specific = generic.MakeGenericType(new Type[] { typeof(int)}); 

// Create the final type (Test123<int>) 
var instance = Activator.CreateInstance(specific, true); 

Et pour définir la valeur:

// Get the property info of the property to set. 
PropertyInfo property = instance.GetType().GetProperty("Test"); 

// Set the value on the instance. 
property.SetValue(instance, 1 /* The value to set */, null) 
+0

Bien sûr que cela fonctionnerait mais disons que je ne sais pas que le paramètre générique est Int .. tout ce que je sais est le type de Test321. – Peter

0

Essayez quelque chose comme ceci:

using System; 
using System.Reflection; 

namespace test { 

    class Test123<T> 
     where T : struct { 
     public Nullable<T> Test { get; set; } 
    } 

    class Test321 { 
     public Test123<int> Test { get; set; } 
    } 

    class Program { 

     public static void Main() { 

      Type test123Type = typeof(Test123<>); 
      Type test123Type_int = test123Type.MakeGenericType(typeof(int)); 
      object test123_int = Activator.CreateInstance(test123Type_int); 

      object test321 = Activator.CreateInstance(typeof(Test321)); 
      PropertyInfo test_prop = test321.GetType().GetProperty("Test"); 
      test_prop.GetSetMethod().Invoke(test321, new object[] { test123_int }); 

     } 

    } 
} 

Cocher cette Overview of Reflection and Generics sur msdn.

Questions connexes