Динамическое Приведение Объектов - PullRequest
1 голос
/ 10 марта 2010

Привет всем. Я пытаюсь привести два объекта к конкретному типу на основе информации об отражении свойства. Я хочу сделать это динамически, поэтому мне не нужно связывать варианты переключений и так далее для каждого типа, чтобы два объекта могли быть в этом классе. В целом они будут в основном int или float. В настоящее время я пытался использовать ключевые слова 'var' и 'object' для хранения входящего значения корректировки и исходного значения свойств.

// .. snip

/* Get property information. */
PropertyInfo propInfo = classObj.GetType().GetProperty("property-name");
if (propInfo == null)
    continue;

/* Prepare object values. */
object orgVal = propInfo.GetValue( classObj, null );
object adjVal = Convert.ChangeType( strAdjust, propInfo.GetType(), new CultureInfo("en-us"));

// .. math on objects here
// ex. orgVal += adjVal;

// .. snip

Входящее корректирующее значение представлено в виде строки, но в формате int или float, поэтому его легко конвертировать. Все это работает нормально, проблема заключается только в том, чтобы кастинг мог корректировать исходное значение с новым значением корректировки.

Я знаю, что в .NET 4.0 есть ключевое слово "dynamic", которое могло бы достичь чего-то подобного, но в настоящее время я застрял, используя 3.5.

Оба объекта будут использовать тип из информации о свойстве propInfo.GetType ().

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

-CK

Редактировать:

Забыл упомянуть, извините, это разрабатывается на Zune HD, поэтому структура, к которой у меня есть доступ, довольно ограничена тем, что можно / нельзя использовать.

Ответы [ 2 ]

2 голосов
/ 10 марта 2010

C # 3.5 имеет класс с именем TypeConverter http://msdn.microsoft.com/en-us/library/system.componentmodel.typeconverter.aspx

Они обеспечивают механизм преобразования из одного типа в другой на основе информации о типе.

System.ComponentModel.TypeConverter GetConverter(System.Type type) 

используется для получения конвертера и

public object TypeConverter.ConvertFrom(object value)

делает преобразование. Есть встроенные конвертеры для базовых типов, таких как int и float, и вы можете написать собственные конвертеры для ваших собственных типов.

У Microsoft есть руководство по их написанию здесь. http://msdn.microsoft.com/en-us/library/ayybcxe5.aspx

0 голосов
/ 10 марта 2010

Есть несколько способов сделать это, о которых я могу подумать. Вы можете использовать отражение, чтобы получить метод "op_Addition" (который по сути является оператором +). Но я бы сделал это через Lambdas:

var orgValueParam = Expression.Parameter(propInfo.PropertyType, "lhs");
var adjValueParam = Expression.Parameter(propInfo.PropertyType, "rhs");

var expr = Expression.Add(orgValueParam, adjValueParam);
var func = Expression.Lambda(expr, orgValueParam, adjValueParam).Compile();
var result = func(orgValue, adjValue);

Примечание: я на самом деле не проверял это, так что я не знаю, сработает ли это наверняка, но с этого я и начну ...

...