Как создать поверхностную копию объекта, чтобы его можно было сериализовать и отправить с помощью вызова веб-метода? - PullRequest
0 голосов
/ 16 февраля 2010

Я хотел бы сериализовать свойства объекта HttpBrowserCapabilities, чтобы он мог быть возвращен через вызов веб-метода. В настоящее время объект не может быть сериализован:

Cannot serialize member System.Web.Configuration.HttpCapabilitiesBase.Capabilities of type System.Collections.IDictionary, because it implements IDictionary. 

... что понятно. Однако я хотел бы просто скопировать свойства и их значения в иерархию, т.е.

<HttpBrowserCapabilities>
   <IsMobile>true</IsMobile>
</HttpBrowserCapabilities>

Я начинаю думать, что мне нужно использовать отражение, чтобы скопировать этот объект, но я не пришел к выводу. У кого-нибудь есть предложения, чтобы это было просто?

Спасибо, George

1 Ответ

2 голосов
/ 16 февраля 2010

Первоначально я опубликовал ответ, используя XmlDocument, но я упустил из виду некоторые элементы веб-метода и не понял, что вы действительно пытались отобразить DTO.

Отражение звучит сложно, но на самом деле это не так. Следующий фрагмент будет делать то, что вы хотите:

public static void Populate(object dest, IDictionary dictionary)
{
    Type t = dest.GetType();
    foreach (object key in dictionary)
    {
        PropertyInfo prop = t.GetProperty(key.ToString(),
            BindingFlags.Instance | BindingFlags.Public);
        if ((prop != null) && prop.CanWrite)
        {
            object value = dictionary[key];
            prop.SetValue(dest, value, null);
        }
    }
}

Затем вызовите это как:

BrowserCapsDto dto = new BrowserCapsDto();
Populate(dto, Capabilities);  // Capabilities is the real BrowserCaps

Это довольно просто, потому что у вас уже есть IDictionary и, таким образом, вы уже знаете все возможные имена, которые вы можете отобразить; вам на самом деле не нужно использовать какое-либо отражение в источнике, просто в пункте назначения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...