2016-05-19 3 views
0

Ich habe eine Methode, die eine Klasseninstanz zurückgibt. z.B.Geben Sie eine anonyme Klasse zurück, die einer benannten Klasse ein Feld hinzufügt

public User GetUser(int id) { return new User(); } 

In den meisten Fällen ist dies gut genug, aber ich habe einen Fall, in dem ich eine andere eingereicht müssen die User Objekt hinzugefügt. Wie kann ich eine benannte Klasse erstellen, die diese Klasse erweitert?

Ist es mit anonymen Klassen möglich? vielleicht etwas wie das:

public object GetExtendedUser(int id) 
{ 
    return GetUser(id).extendsAnonymous(new { 
     avatar: "~/avatar/bird.png" 
     }); 
} 

Von dem, was ich bis jetzt gesehen habe, ist es nicht möglich. Id muss entweder eine benannte Klasse deklarieren oder die ursprünglichen Felder explizit in einer anonymen Klasse deklarieren:

public object GetExtendedUser(int id) 
{ 
    User user = GetUser(id); 
    return new { 
     username: user.username, 
     role = user.role, 
     ... 
     avatar: "~/avatar/bird.png" 
     }; 
} 

Aber das ist hässlich.

Gibt es eine nette Lösung?

Antwort

0

Sie könnten eine DynamicObject verwenden. Wenn Sie Ihr Benutzerobjekt so ändern, dass es von DynamicObject erbt und einige einfache Überschreibungen implementiert, können Sie dem Objekt Eigenschaften hinzufügen.

class User : DynamicObject 
{ 
    Dictionary<string, object> properties = new Dictionary<string, object>(); 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     if (properties.ContainsKey(binder.Name)) 
     { 
      result = properties[binder.Name]; 
      return true; 
     } 
     else 
     { 
      result = "Invalid Property!"; 
      return false; 
     } 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     properties[binder.Name] = value; 
     return true; 
    } 
} 

public dynamic GetExtendedUser(int id) 
{ 
    dynamic user = new User(); 
    user.ExtraProperty = "TADA!"; 
    return user; 
} 

public void MyMethod() 
{ 
    dynamic user = GetExtendedUser(123); 

    Console.WriteLine(user.ExtraProperty); 
    Console.ReadLine(); 
} 
+0

, das wie es aussieht, funktionieren könnte, aber es ist ein bisschen zuviel des Guten für meine Situation – summerbulb

+0

Auch will ich nicht 'User' – summerbulb

+0

ändern Wenn Sie Benutzer nicht ändern möchten Sie ein verwenden könnte ExpandoObject und verwende Reflektion, um über die Eigenschaften des User-Objekts zu iterieren und sie dem ExpandoObject hinzuzufügen, aber das ist wahrscheinlich noch mehr wie Overkill! :) – DoctorMick

Verwandte Themen