0

Если у меня есть список информации о свойствах и экземпляр объекта, из которого они произошли, как я могу создать другой объект, содержащий эти свойства и значения?Динамически добавлять свойства `dynamic` type

например.

public dynamic Sanitize<T>(T o) 
{ 
    if (ReferenceEquals(o, null)) 
    { 
     return null; 
    } 

    var type = o.GetType(); 

    var propertyInfos = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); 

    dynamic sanitized = new ExpandoObject(); 

    foreach (var propertyInfo in propertyInfos) 
    { 
     var name = propertyInfo.Name; 
     var value = propertyInfo.GetValue(o, null); 

     // Add this property to `sanitized` 
    } 

    return sanitized; 
} 

ответ

2

Вы можете бросить ExpandoObject к IDictionary<string, object>, а затем манипулировать ими, как например во время выполнения, чтобы добавить свойства:

var sanitized = new ExpandoObject() as IDictionary<string, object>; 

foreach (var propertyInfo in propertyInfos) 
{ 
    var name = propertyInfo.Name; 
    var value = propertyInfo.GetValue(o, null); 
    sanitized.Add(name, value); 
} 
+0

Как ссылаются свойства от этого? 'sanitizedType.PublicBoolTrue' и' sanitizedType ["PublicBoolTrue"] 'оба выдают исключения. – BanksySan

+0

Где вам нужно ссылаться на эти свойства? Внутри метода? Я бы предпочел разделить это на два метода. Первый будет заполнять ExpandoObject словарем, как показано в моем ответе, а затем вызвать метод, после чего вы сможете ссылаться на те свойства, которые вы указали при условии, что вы сохранили результат этого вызова метода в переменной динамического типа , В противном случае, если вам нужно ссылаться на свойство внутри того же метода, вы можете использовать 'sanitized [" PublicBoolTrue "]'. –

+0

Целью является регистрация. Входной объект 'o' может иметь свойства, связанные с' [NotLoggable] ', поэтому этот метод должен возвращать объект, содержащий только общедоступные свойства« loggable ». – BanksySan

Смежные вопросы