2010-03-09 4 views
1

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

// .. 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» или в формате «» флоат поэтому он будет легко преобразован. Все это прекрасно работает, только для кастинга можно настроить исходное значение с новым значением корректировки, которое является проблемой.

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

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

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

-CK

Edit:

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

+0

Извините, КК, я действительно не могу понять из вопроса, что вы пытаетесь выполнить. Почему вы пытаетесь это сделать и какую ошибку вы видите при запуске кода? –

+0

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

 int n1 = 12; int n2 = 34; int n3 = n1 + n2; 
Вы не можете сделать это с переменными 'object', поэтому я ищу способ их отличить, не имея при этом строгий код, или использование блоков проверок и статически кодированных преобразований для каждого типа. –

+0

Я не уверен, что это возможно быть честным. Не имея случая переключения if-elseif, я понятия не имею, как это можно сделать (даже с динамикой). Typecasting обрабатывается compiletime (если я не ошибаюсь, что может быть так), и, чтобы это было сделано динамически, я не думаю, что это возможно. Однако, если это просто цифры, почему бы просто не бросить все, чтобы удваивать/плавать? – Alxandr

ответ

0

Существует несколько способов сделать это, о чем я могу думать. Вы можете использовать отражение, чтобы получить метод «op_Addition» (который в основном «оператор +»). Но, как я хотел бы сделать это с помощью Лямбд:

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); 

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

+0

Спасибо за предложение, а также codeka. Как уже говорилось выше, я забыл упомянуть об этом для развития Zune HD. Я также не могу получить доступ к классу Linq Expression на этом устройстве, класс не существует в среде Zune HD. –

2

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

Не только C# 3.5, это с тех пор, как .NET 1.0 ... –

+0

Спасибо за предложение Спайк, я забыл какую-то информацию, которую полностью забыл, когда я набрал вопрос. Я не могу использовать этот класс, потому что он разрабатывается для Zune HD. У меня нет доступа к TypeConverter вообще, класс пуст, и TypeDescritpor также не хватает. MSDN говорит, что он работает на Zune, но, по-видимому, не на Zune HD. Спасибо за предложение. –