2016-05-20 6 views
1

Ich möchte ein anonymes Objekt dynamisch auf der Grundlage eines vorhandenen Objekts und einer Whitelist erstellen..NET - Whitelisting Eigenschaften an anonymes Objekt

Zum Beispiel habe ich die folgende Klasse:

class Person 
{ 
    string FirstName; 
    string LastName; 
    int Age; 
} 

Jetzt habe ich eine Funktion FilterObject erstellt habe eine neues anonymes obj auf den whitelist Parameter wie diese Basis zu erstellen:

public static class Filter 
{ 
    public static object FilterObject(Person input, string[] whitelist) 
    { 
     var obj = new {}; 

     foreach (string propName in whitelist) 
      if (input.GetType().GetProperty(propName) != null) 
       // Pseudo-code: 
       obj.[propName] = input.[propName]; 

     return obj; 
    } 
} 

// Create the object: 
var newObj = Filter.FilterObject(
    new Person("John", "Smith", 25), 
    new[] {"FirstName", "Age"}); 

Das Ergebnis sollte sei wie unten. Ich möchte dieses Objekt für meine Web-API verwenden.

var newObj = new 
{ 
    FirstName = "John", 
    Age = 25 
}; 

Gibt es eine Möglichkeit, dies zu erreichen?

Antwort

1

Sie können versuchen, mit ExpandoObject (.net 4 oder superior):

class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int Age { get; set; } 
} 

static class Filter 
{ 
    public static object FilterObject(Person input, string[] whitelist) 
    { 
     var o = new ExpandoObject(); 
     var x = o as IDictionary<string, object>; 

     foreach (string propName in whitelist) 
     { 
      var prop = input.GetType().GetProperty(propName); 

      if (prop != null) 
      { 
       x[propName] = prop.GetValue(input, null); 
      } 
     } 

     return o; 
    } 
} 

Dies ist nur eine Probe auf dem Code basiert, aber es ist ein guter Ausgangspunkt.

1

Wie wäre es mit einem Wörterbuch?

public static object FilterObject(Person input, string[] whitelist) 
{ 
    var obj = new Dictionary<string, object>(); 

    foreach (string propName in whitelist) 
    { 
     var prop = input.GetType().GetProperty(propName); 

     if(prop != null) 
     { 
      obj.Add(propName, prop.GetValue(input, null)); 
     } 
    }    

    return obj; 
} 

Eine andere Sache, müssen Sie wirklich ein Objekt zurückgeben? Wenn Sie immer nach Eigenschaften in der Whitelist suchen, die im Person-Typ vorhanden ist, warum geben Sie dann keine Instanz der Person-Klasse zurück?

+0

Es sollte ein Objekt sein, wie ich es für eine Web-API verwenden möchte. –

+0

Sind Sie besorgt, weil Sie mit "Null" -Eigenschaften in der Klasse Person enden würden? Sie können so leicht umgehen. – jpgrassi