Laden...

Mit reflection die generische einschränkung ermitteln

Erstellt von lord_fritte vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.247 Views
L
lord_fritte Themenstarter:in
553 Beiträge seit 2007
vor 13 Jahren
Mit reflection die generische einschränkung ermitteln

Hallo, ich habe ein Problem. Ich möchte über reflection die generischen Parameter und deren Einschränkungen ermitteln, um zu bestimmen, welche Typen als Parameter erlaubt sind.
Aber wie unterscheide ich zwischen, gar keiner Einschränkung und class als Einschränkung?

Ich habe hier mal ein kleines Testprogramm geschrieben, aber zwischen gar keiner Einschränkung und class als Einschränkung, sehe ich überhaupt keinen Unterschied, oder übersehe ich was?


public class Test<T0, T1, T2, T3, T4, T5> 
    where T1 : class 
    where T2 : struct
    where T3 : ICloneable 
    where T4 : BinaryReader
    where T5 : List<int>
  {
  }

static void Main(string[] args)
    {
      Type type = typeof(Test<,,,,,>);
      Type[] genericArguments = type.GetGenericArguments();

      foreach (Type genericArgument in genericArguments)
      {
        string name = genericArgument.Name;
        Type baseType = genericArgument.BaseType;
        Type[] baseInterfaces = genericArgument.GetInterfaces();
        bool isClass = genericArgument.IsClass;
        bool isAnsiClass = genericArgument.IsAnsiClass;
        bool isStruct = genericArgument.IsValueType;
        bool isInterface = genericArgument.IsInterface;
        Type[] constraints = genericArgument.GetGenericParameterConstraints();
      }
}

Gelöschter Account
vor 13 Jahren

Gar keine Einschränkung:
BaseType == Object
GenericParameterAttributes == None

Class als Einschränkung:
BaseType == Object
GenericParameterAttributes == ReferenceTypeConstraint

L
lord_fritte Themenstarter:in
553 Beiträge seit 2007
vor 13 Jahren

Wunderbar, Danke!

L
lord_fritte Themenstarter:in
553 Beiträge seit 2007
vor 13 Jahren

Ich habe noch eine Frage, ich habe folgendes Gebilde:


public class TestClass1<T>
  {
    public delegate void TestDelegate();

    public class TestClass2<T, T2>
    {
      public delegate void TestDelegate<T>();
    }
  }

Type t = typeof(TestClass1<>.TestClass2<,>.TestDelegate<>);
Type[] t2 = t.GetGenericArguments();

Zurück, bekomme ich aber in t2 4 Parameter, kann ich zuordnen welches Parameter zu welchem Typ gehören?
Denn das Property "DeclaringType" verweist bei allen 4 Parametern auf den Typ: TestConsole.TestClass11+TestClass22+TestDelegate`1

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo lord_fritte,

Visual Studio spuckt folgende zwei Warnungen aus:

Fehlermeldung:

Type parameter 'T' has the same name as the type parameter from outer type 'ConsoleApplication6.TestClass1<T>'

Type parameter 'T' has the same name as the type parameter from outer type 'ConsoleApplication6.TestClass1<T>.TestClass2<T,T2>'

Bringt das ein wenig Licht ins Dunkel? Ich hoffe mal, ich habe dich richtig verstanden.

zero_x