Laden...

CustomAttribute eines Feld auslesen

Erstellt von Robin0 vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.173 Views
R
Robin0 Themenstarter:in
212 Beiträge seit 2012
vor 10 Jahren
CustomAttribute eines Feld auslesen

Hallo,

Ich möchte gerne den Feldern einer klasse ein Attribut mitgeben:
(*Funktioniert auch soweit)


   public SampleClass
   {
      private int m_Var;
      [Test("Hallo")]
      public int Var
      {
         get{return m_Var;}
         set{m_Var = value;}
      }
      //.
      //.
      //.
   }

[AttributeUsage(AttributeTargets.Field)]
    public class TestAttribute : Attribute
    {
        public string Target = "";

        public SerialisationTargetAttribute(string _Target)
        {
            Target = _Target;
        }
    }

Nun würde ich dieses Attribut gerne in einer in einer Extension auslesen ohne noch weitere werte übergeben zu müssen.
Ich bekomm das so nicht hin


public static class Extensions
{
public static string GetTarget<T>(this T myObject)
{
//---Hier muss ich immer den Parent und den namen des Attributs mitgeben -.-
// (Suboptimal) es würde schon reichen wenn ich den namen schon nichmehr mitgeben muss

//return (Parent.GetType().GetField("Var").GetCustomAttributes(typeof(TestAttribute ),false)[0] as TestAttribute ).Target;

return "";//my z.B. Hallo
}

Danke im vorraus wenn jemand ne gute idee hat.

16.806 Beiträge seit 2008
vor 10 Jahren

Kann man quasi 1:1 aus der MSDN (Description Attribute) kopieren und auf sein eigenes Attribute ummodellieren.

public static string GetEnumSerialisationTarget(Enum source)
{
    FieldInfo fi = value.GetType().GetField(source.ToString());

    SerialisationTargetAttribute[] attributes =(SerialisationTargetAttribute [])fi.GetCustomAttributes(typeof(SerialisationTargetAttribute ), false);

    if (attributes != null &&attributes.Length > 0)
        return attributes[0].Target;
    else
        return source.ToString();
}

Du solltest aber mit Eigenschaften arbeiten und nicht mit Feldern.

R
Robin0 Themenstarter:in
212 Beiträge seit 2012
vor 10 Jahren

puh, ja was soll ich jetz in source und was in value schreiben?
wenn wir mal davon ausgehen das ich das aus GetTarget<T>(this T myObject){} aufrufen werde

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo Robin0,

ab .net 4.5 gibt dafür ein wenig bessere (Erweiterungs-) Methoden.


	public static class Extensions
	{
		public static string GetTarget<T>(this T myObject)
		{
			Type type = typeof(T);

			TestAttribute attribute = type.GetFields(BindingFlags...)
				.Select(fi => fi.GetCustomAttribute<TestAttribute>(false))
				.FirstOrDefault(t => t != null);

			return attribute != null ? attribute.Target : null;
		}
	}

Siehe auch [Artikel] Attributbasierte Programmierung

Du solltest wirklich besser mit Eigenschaften als mit öffentlichen Feldern arbeiten.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

R
Robin0 Themenstarter:in
212 Beiträge seit 2012
vor 10 Jahren

Ich hätte villeicht sagen solln das ich .Net 4 verwende.
(Ich verwende die attribute im grundegenommen eigentlich für die Eigenschaften, hab nur beim rumprobiren auf beides erstmal ein attribut gelegt)

Die sache ist die:
Ich will das das Attribut des elements das für das die Extension angewendet wird, nicht für ein unterelement, ausdiesemgrund kommt man mit dem typen ansich auch nich weiter. Dann könnte ich das Attribut ja auch an die Klasse binden.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo Robin0,

wie man innerhalb eines Getter oder Setters an die Attribute der umgebenden Property kommt, wurde in [Artikel] Attribute zur Prüfung von Properties verwenden ausführlich behandelt. Im Verlaufe des Threads werden mehrere Vorschläge gemacht und verglichen.

Die beste Möglichkeit vor 4.5 ist wohl MethodBase.GetCurrentMethod ().Name. Und ab 4.5 gibt es eine spezielle Syntax in C# dafür (beschrieben auf der zweiten Seite des genannten Threads).

herbivore

R
Robin0 Themenstarter:in
212 Beiträge seit 2012
vor 10 Jahren

Soweit war ich auchschon XD.
Ich möchte aber das attribut außerhalb des getters und setters auslesen.
Genau da stellt sich mein problem, wie komme ich außerhalb des getters und setters an das Attribut?

4.931 Beiträge seit 2008
vor 10 Jahren

Entweder du mußt den Eigenschaftennamen übergeben oder aber über alle Eigenschaften iterieren (GetProperties).