[.NET 3.5] Extension methods en inheritance

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Kun
  • Registratie: December 2008
  • Laatst online: 25-09 10:49
Ik heb de volgende extension methods geschreven voor de MemberInfo class in the System.Reflection namespace. Maar ik kan ze niet gebruiken op bijvoorbeeld te System.Type class. Is er een mogelijkheid om dit wel voor elkaar te krijgen zonder de code te dupliceren aangezien de Type class een afgeleide is van de MemberInfo class?


C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public static class MemberInfoExtensions
{
    #region Public Methods

    public static T GetAttribute<T>(this MemberInfo type) where T : Attribute
    {
        return MemberInfoExtensions.GetAttribute<T>(type, true);
    }

    public static T GetAttribute<T>(this MemberInfo type, bool inherit) where T : Attribute
    {
        T[] attributes = MemberInfoExtensions.GetAttributes<T>(type, inherit);

        if (attributes.Length > 0)
        {
            return attributes[0];
        }

        return default(T);
    }

    public static T[] GetAttributes<T>(this MemberInfo type) where T : Attribute
    {
        return MemberInfoExtensions.GetAttributes<T>(type, true);
    }

    public static T[] GetAttributes<T>(this MemberInfo type, bool inherit) where T : Attribute
    {
        return (T[])type.GetCustomAttributes(typeof(T), inherit);
    }

    #endregion
}

[ Voor 3% gewijzigd door Kun op 13-12-2008 12:32 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Hoewel ik het me wel iets afvraag over het nut en de naamgeving, werkt dit gewoon :?
Getest met:
C#:
1
var t = typeof(String).GetAttribute<SerializableAttribute>();

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Het nut is dat je niet meer 3 of 4 regels code hoeft te schrijven met de reflection API maar meteen kunt kijken of die klasse het desbetreffende attribuut ondersteund.

En bij mij werkt t ook overigens.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
D-Raven schreef op zaterdag 13 december 2008 @ 16:48:
Het nut is dat je niet meer 3 of 4 regels code hoeft te schrijven met de reflection API maar meteen kunt kijken of die klasse het desbetreffende attribuut ondersteund.
Met de code die generieker is, duidelijkere naamgeving heeft en onderaan de help staat kan het ook gewoon in een regel:
C#:
1
var t = typeof(String).GetCustomAttributes<SerializableAttribute>().FirstOrDefault();

En de originele functie gebruiken is al niet veel langer. En ik doelde erop dat Reflection vaak misbruikt wordt, wat ook in dit geval best zo zou kunnen zijn... :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten