Глубокое отражение в .NET - PullRequest
3 голосов
/ 14 января 2011

Мне нужно создать возможность детализировать объекты такими свойствами, как две или три глубины. Например, класс A имеет ссылку на свойство класса B, которое мне нужно для доступа к классу C. Как лучше всего это сделать: прямое отражение, или, возможно, использование TypeDescriptor, или что-то еще?

Спасибо.

Ответы [ 3 ]

1 голос
/ 14 января 2011

Если вы знаете путь в статическом контексте (т. Е. Путь всегда один и тот же) и свойства доступны (внутренние или общедоступные), вы можете использовать динамический

    [Test]
    public void Foo()
    {
        var a = new A
        {
            B = new B
            {
                C = new C
                {
                    Name = "hello"
                }
            }
        };


        DoReflection(a);
    }

    private void DoReflection(dynamic value)
    {
        string message = value.B.C.Name;
        Debug.WriteLine(message);
    }
1 голос
/ 14 января 2011

Это не так сложно написать.Я собрал несколько классов, чтобы справиться с этим, чтобы я мог сериализовать свойства WinForm.Взгляните на этот класс и связанные с ним классы.

http://csharptest.net/browse/src/Library/Reflection/PropertySerializer.cs

0 голосов
/ 14 января 2011

Если вы хотите написать собственный код сериализации по любой причине, вы будете использовать рефлексию.

Что вы делаете, так это пишете рекурсивный метод сериализации типа.Затем вы применяете это так, как считаете нужным, чтобы получить результат.

var type = myObjectOfSomeType.GetType();
// now depending on what you want to store
// I'll save all public properties
var properties = type.GetProperties(); // get all public properties
foreach(var p in properties)
{
    var value = p.GetValue(myObjectOfSomeType, null);
    Writevalue(p.Name, value);
}

Реализация WriteValue должна распознавать встроенные типы и обрабатывать их соответственно, это типичные вещи, такие как string, char, integer,double, DateTime и т. д.

  • Если он встречает последовательность или коллекцию, вам нужно выписать много значений.
  • Если встречается нетривиальный тип, вы снова примените этот рекурсивный шаблон.

Конечным результатом является рекурсивный алгоритм, который обходит вашу объектную модель и записывает значения при обнаружении типов, которые я знаю, как сериализовать.

Однако я рекомендую изучитьWCF, не для создания сервисов, а для сериализации.Он поставляется как часть платформы .NET 3.0 с новой сборкой System.Runtime.Serilization и в целом очень эффективен при работе с сериализацией и аннотациями данных.

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