Получение значения от динамического объекта динамично

Да, заголовок звучит немного сбивающим с толку, таким образом, я объясню, что я имею в виду: предположите, что у Вас есть C# 4.0 'динамический' объект и название свойства. Как Вы получили бы то свойство от динамического объекта?

Другими словами, как был бы Вы реализовывать:

public static object GetDynamicValue(dynamic o, string name) { ... }

Другой способ поместить его состоит в том, что я пытаюсь рассматривать динамический объект как IDictionary.

Обратите внимание, что отражение вероятно не опция здесь, так как динамический объект мог быть пользовательской реализацией, которая не является базирующимся отражением (например, путем расширения DynamicObject и выполнения его собственной вещи).

9
задан David Ebbo 7 March 2013 в 22:16
поделиться

1 ответ

Вам нужно будет создать сайт для звонков, создать связыватель и т. д.

Самый простой способ увидеть, что происходит, - скомпилировать это:

public static object GetDynamicValue(dynamic o, string name)
{
    return o.Foo;
}

Затем декомпилировать его с помощью Reflector и выяснить, что он делает. Имейте в виду, что это будет довольно сложно - и вам нужно будет изменить его с единого, статического, кешированного сайта вызовов на создание нового при каждом вызове.

Вот пример, который действительно работает ... но полностью правильный или нет - другой вопрос: ) (Я добился этого, выполнив именно то, что предлагал выше.)

using Microsoft.CSharp.RuntimeBinder;
using System;
using System.Dynamic;
using System.Runtime.CompilerServices;

class Test
{
    public static object GetDynamicValue(dynamic o, string name)
    {
        CallSite<Func<CallSite, object, object>> site 
            = CallSite<Func<CallSite, object, object>>.Create
            (Binder.GetMember(CSharpBinderFlags.None, name, 
             typeof(Test), new CSharpArgumentInfo[] 
             { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) }));
        return site.Target(site, o);
    }

    static void Main()
    {
        Console.WriteLine(GetDynamicValue("hello", "Length"));
    }
}
14
ответ дан 4 December 2019 в 12:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: