C # CodeGeneration переменная как тип - PullRequest
3 голосов
/ 17 марта 2011

В существующем приложении генерируется код для выполнения приведения, как показано ниже: (типы также являются сгенерированными классами, в качестве примера я приведу только object и string)

object o;
string s = (string)o;

Если o имеет тип int, выдается InvalidCastException. Поэтому я хочу изменить код на:

object o;
string s = o as string;

и позже проверьте, является ли string s нулевым.

System.CodeDom используется для генерации кода. Приведение генерируется с использованием класса CodeCastExpression.

Я не могу найти способ создать variable as type способ ... Может кто-нибудь мне помочь? Спасибо!

Ответы [ 3 ]

1 голос
/ 17 марта 2011

Как насчет использования System.ComponentModel.TypeConverter. У этого есть методы, чтобы проверить, являются ли это CanConvertFrom(Type) и CanConvertTo(Type) и имеет "универсальный" метод ConvertTo, который принимает Объект в и возвращает Объект:

public Object ConvertTo(
    Object value,
    Type destinationType
)

Посмотрите здесь: http://msdn.microsoft.com/en-us/library/system.componentmodel.typeconverter.aspx

1 голос
/ 17 марта 2011

Может быть, вы хотите попробовать это вместо:

//For string...
string s = (o == null ? null : o.ToString());
//For int...
int i = (o == null ? 0 : Convert.ToInt32(o));

Может быть, вы можете просто поставить оператор if раньше, чтобы код читал:

TheType s = null;

if (o is TheType)
    s = (TheType)o

Это будет работать только с не-типами-значениями. См. этот пост для получения информации о том, как выполнить оператор "is".

0 голосов
/ 17 марта 2011

Проблема в том, что оператор «as» нельзя использовать с не ссылочным типом.

Например:

public class ConverterThingy
{
    public T Convert<T>(object o)
        where T : class
    {
        return o as T;
    }

    public T Convert<T>(object o, T destinationObj)
        where T : class
    {
        return o as T;
    }
}

Это должно работать для большей части.Вы можете выполнить преобразование из любого объекта в другой ссылочный тип.

SomeClass x = new ConverterThingy().Convert<SomeClass>(new ExpandoObject());
// x is null
SomeClass x = null;
x = new ConverterThingy().Convert(new ExpandoObject(), x);
// x is null, the type of x is inferred from the parameter
...