Свойство Nullable набора <> отражением

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

я думаю, что лучший способ зарегистрировать перечисления подобен регулярным классам: перечислимый тип получает описание функции и роль перечисления в целом (" Something values are used to indicate which mode of operation a client wishes..."), и каждое перечисление значений получает описание Javadoc своей цели и функции (" FIRST_THING indicates that the operation should evaluate the first argument first..").

, Если описания перечисления значений коротки, Вы могли бы хотеть поместить их на одну строку как /** Evaluate first argument first. */, но я рекомендую сохранить каждое перечисление значений на его собственной строке. Большинство IDE может быть настроено для форматирования их этот путь автоматически.

12
задан Cédric Boivin 28 September 2009 в 19:02
поделиться

4 ответа

Если вы хотите преобразовать произвольную строку в базовый тип Nullable, вы можете использовать класс Convert:

var propertyInfo = typeof(Foo).GetProperty("Bar");
object convertedValue = null;
try 
{ 
    convertedValue = System.Convert.ChangeType("1256", 
        Nullable.GetUnderlyingType(propertyInfo.PropertyType));
} 
catch (InvalidCastException)
{
    // the input string could not be converted to the target type - abort
    return;
}
propertyInfo.SetValue(fooInstance, convertedValue, null);

Этот пример будет работать, если целевой тип - int, short, long (или варианты без знака, так как входная строка представляет собой неотрицательное число), double, float или decimal. Предупреждение: это не быстрый код.

16
ответ дан 2 December 2019 в 04:25
поделиться

Если это значение int, допускающее значение NULL, вам необходимо использовать параметр int, а не строку.

 property.SetValue(klass,1256,null);

Обратите внимание на изменение к классу, а не к классу, поскольку класс - это зарезервированное ключевое слово. Вы также можете использовать @class, если это абсолютно необходимо (цитируя его).

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

 var nullType = Nullable.GetUnderlyingType(property.PropertyType)
 var value = Convert.ChangeType("1256", nullType );
 property.SetValue(klass, value, null );
9
ответ дан 2 December 2019 в 04:25
поделиться

«1256» - это строка, а не целое число.

2
ответ дан 2 December 2019 в 04:25
поделиться

Вот полный пример, показывающий, как это сделать:

using System;
using System.Reflection;

class Test
{
    static void Main()
    {
        Foo foo = new Foo();
        typeof(Foo).GetProperty("Bar")
            .SetValue(foo, 1234, null);
    }
}

class Foo
{
    public Nullable<Int32> Bar { get; set; }
}

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

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

Вот пример того, что я имею в виду:

using System;
using System.Reflection;

class Test
{
    static void Main()
    {
        Foo foo = new Foo();

        PropertyInfo property = typeof(Foo).GetProperty("Bar");
        Object value =
            Convert.ChangeType("1234",
                Nullable.GetUnderlyingType(property.PropertyType)
                ?? property.PropertyType);

        property.SetValue(foo, value, null);
    }
}

class Foo
{
    public Nullable<Int32> Bar { get; set; }
}

Этот подход можно безопасно использовать независимо от того, является ли свойство Nullable <> .

5
ответ дан 2 December 2019 в 04:25
поделиться
Другие вопросы по тегам:

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