Проверьте, доступно ли свойство для динамической переменной - PullRequest
205 голосов
/ 08 июня 2010

Моя ситуация очень проста.Где-то в моем коде у меня есть это:

dynamic myVariable = GetDataThatLooksVerySimilarButNotTheSame();

//How to do this?
if (myVariable.MyProperty.Exists)   
//Do stuff

Итак, в основном мой вопрос состоит в том, как проверить (без исключения), что определенное свойство доступно для моей динамической переменной.Я мог бы сделать GetType(), но я бы предпочел этого избежать, поскольку мне не нужно знать тип объекта.Все, что я действительно хочу знать, это доступность свойства (или метода, если это облегчает жизнь).Есть указатели?

Ответы [ 13 ]

0 голосов
/ 11 июля 2018

В моем случае мне нужно было проверить наличие метода с определенным именем, поэтому я использовал интерфейс для этого

var plugin = this.pluginFinder.GetPluginIfInstalled<IPlugin>(pluginName) as dynamic;
if (plugin != null && plugin is ICustomPluginAction)
{
    plugin.CustomPluginAction(action);
}

Кроме того, интерфейсы могут содержать больше, чем просто методы:

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

От: Интерфейсы (Руководство по программированию в C #)

Элегантно и не нужно ловить исключения или играть с отражением ...

0 голосов
/ 27 января 2015

Вот другой способ:

using Newtonsoft.Json.Linq;

internal class DymanicTest
{
    public static string Json = @"{
            ""AED"": 3.672825,
            ""AFN"": 56.982875,
            ""ALL"": 110.252599,
            ""AMD"": 408.222002,
            ""ANG"": 1.78704,
            ""AOA"": 98.192249,
            ""ARS"": 8.44469
}";

    public static void Run()
    {
        dynamic dynamicObject = JObject.Parse(Json);

        foreach (JProperty variable in dynamicObject)
        {
            if (variable.Name == "AMD")
            {
                var value = variable.Value;
            }
        }
    }
}
0 голосов
/ 03 мая 2011

Если вы контролируете тип, используемый как динамический, не могли бы вы вернуть кортеж вместо значения для каждого доступа к свойству?Что-то вроде ...

public class DynamicValue<T>
{
    internal DynamicValue(T value, bool exists)
    {
         Value = value;
         Exists = exists;
    }

    T Value { get; private set; }
    bool Exists { get; private set; }
}

Возможно, наивная реализация, но если вы каждый раз создаете одну из них внутренне и возвращаете ее вместо фактического значения, вы можете проверить Exists при каждом доступе к свойству, а затемнажмите Value, если оно имеет значение default(T) (и не имеет значения), если это не так.

Тем не менее, мне может не хватать некоторых знаний о том, как работает динамическая система, и это может быть нереальным.

...