Как 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 может быть настроено для форматирования их этот путь автоматически.
Если вы хотите преобразовать произвольную строку в базовый тип 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. Предупреждение: это не быстрый код.
Если это значение 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 );
Вот полный пример, показывающий, как это сделать:
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 <>
.