TryInvokeMember не срабатывает, если имя подшивки - GetType () или ToString () и т. Д. - PullRequest
1 голос
/ 12 августа 2011

Я просто возился с динамическим ключевым словом C # 4.0, и мне стало любопытно одно:

Предположим, у меня есть класс DynamicWeirdness : DynamicObject

Внутри него есть поле с именемreference, который также имеет тип dynamic.И поле с именем referencetype, которое имеет тип Type

Это мой конструктор:

public DynamicWeirdness(object reference)
{
        this.reference = reference;
        this.referencetype = reference.GetType();
}

Если я когда-либо попробую это:Я вызываю GetType() объекта DynamicWeirdness, он просто игнорирует мой вызов и возвращает {Name = "DynamicWeirdness" FullName = "Dynamic1.DynamicWeirdness"}.Почему?

Я пробовал с ToString(), GetHashCode(), и происходит то же самое.

Ответы [ 2 ]

3 голосов
/ 12 августа 2011

Согласно документации для DynamicObject :

Вы также можете добавлять свои собственные члены в классы, производные от класса DynamicObject.Если ваш класс определяет свойства, а также переопределяет метод TrySetMember, динамическая языковая среда выполнения (DLR) сначала использует связыватель языка для поиска статического определения свойства в классе.Если такого свойства нет, DLR вызывает метод TrySetMember.

Поскольку DynamicObject наследуется от Object, любые методы Object будут препятствовать TryInvokeMember в обработке вызова.

2 голосов
/ 12 августа 2011

Методы GetType(), ToString() и GetHashCode() все определены в DynamicObject (поскольку он наследуется от System.Object).Когда .NET переходит к вызову этих методов, он просто вызывает их напрямую, так как они определены для объекта, и пропускает вызов на TryInvokeMember.

. Вы можете увидеть это в действии, если попытаетесь вызватьдругой метод, например Substring(), и вы увидите, что TryInvokeMember для DynamicWeirdness действительно вызывается.

Вместо переопределения TryInvokeMember для DynamicWeirdness для возврата другого типа, вы можете простосоздайте новый метод GetType() для DynamicWeirdness.

public new Type GetType()
{
    return this.referencetype;
}

Для GetHashCode() и ToString() вы можете переопределить эти элементы на DynamicWeirdness, так как они помечены как виртуальные.

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