2017-02-24 4 views
2

Ich habe diesen CodeReflexion von Objekteigenschaften

public class ParameterOrderInFunction : Attribute 
    { 
     public int ParameterOrder { get; set; } 
     public ParameterOrderInFunction(int parameterOrder) 
     { 
      this.ParameterOrder = parameterOrder; 
     } 
    } 


    public interface IGetKeyParameters 
    { 

    } 

    public class Person: IGetKeyParameters 
    { 

     [ParameterOrderInFunction(4)] 
     public string Age { get; set; } 
     public string Name { get; set; } 
     [ParameterOrderInFunction(3)] 
     public string Address { get; set; } 
     [ParameterOrderInFunction(2)] 
     public string Language { get; set; } 

     [ParameterOrderInFunction(1)] 
     public string City { get; set; } 

     public string Country { get; set; }   
    } 


    class Program 
    { 
     static void Main(string[] args) 
     { 

      Person person = new Person(); 

      person.Address = "my address"; 
      person.Age = "32"; 
      person.City = "my city"; 
      person.Country = "my country";    

      Test t = new Test(); 
      string result = t.GetParameter(person); 
      //string result = person.GetParameter(); 

      Console.ReadKey(); 

     }  
    } 

    public class Test 
    { 
     public string GetParameter(IGetKeyParameters obj) 
     { 
      string[] objectProperties = obj.GetType() 
       .GetProperties() 
       .Where(p => Attribute.IsDefined(p, typeof(ParameterOrderInFunction))) 
       .Select(p => new 
       { 
        Attribute = (ParameterOrderInFunction)Attribute.GetCustomAttribute(p, typeof(ParameterOrderInFunction), true), 
        PropertyValue = p.GetValue(this) == null ? string.Empty : p.GetValue(this).ToString() 
       }) 
       .OrderBy(p => p.Attribute.ParameterOrder) 
       .Select(p => p.PropertyValue) 
       .ToArray(); 
      string keyParameters = string.Join(string.Empty, objectProperties); 
      return keyParameters; 

     } 
    } 

Was ich zu tun versuchen zu Eigenschaften Werte als eine Zeichenfolge mit etwas bestellen.

es funktioniert gut, wenn ich die Funktion GetParameter innerhalb der Personenklasse setzen. jedoch möchte ich die Funktion GetParameter mit anderen Klasse auch verwenden, , so dass ich leere Schnittstelle erstellen. Jetzt möchte ich, dass jedes Objekt vom Typ IGetKeyParameters die Funktion verwenden kann. aber ich bin immer Ausnahme in der Zeile:

PropertyValue = p.GetValue(this) == null ? string.Empty : p.GetValue(this).ToString() 
+5

'aber ich bekomme eine Ausnahme in der Zeile 'bitte posten Sie die Ausnahme. – Stefan

+0

NullReferenceException? –

+0

{"Objekt stimmt nicht mit dem Zieltyp überein."} – dan

Antwort

3

Sie sollten Ladeeigenschaften von this ändern Objekt Parameter (dh nicht solche Eigenschaften hat):

PropertyValue = p.GetValue(obj) == null ? string.Empty : p.GetValue(obj).ToString() 
+0

Arbeit, Danke !! ! – dan

2

Sie sind die falsche Referenz vorbei als Parameter an die Methode, müssen Sie das Objekt zu übergeben, die Sie die Art und Eigenschaften erhalten verwendet, ändern Sie so:

p.GetValue(this) // this means pass current instance of containing class i.e. Test 

zu:

p.GetValue(obj) 

Ihre Aussage p.GetValue(this) currenly bedeutet die aktuelle Instanz der Klasse Test als Parameter zu übergeben, die ich nicht bin mir ziemlich sicher ist, was Sie wollen.

in Ihrem Beispielcode.

Verwandte Themen