C#CodeGeneration变量作为类型

时间:2011-03-17 15:12:04

标签: c# code-generation

在现有的应用程序中,生成代码以执行强制转换,如下所示:(类型也是生成的类,我提供的示例仅包含objectstring

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 个答案:

答案 0 :(得分:1)

也许你想尝试这个:

//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

这仅适用于非值类型。有关如何完成“是”运算符的信息,请参阅this post

答案 1 :(得分:1)

使用System.ComponentModel.TypeConverter怎么样? 它有方法来检查它是CanConvertFrom(Type)CanConvertTo(Type),并且具有“通用”ConvertTo方法,它接受一个Object并返回一个Object:

public Object ConvertTo(
    Object value,
    Type destinationType
)

看看这里:http://msdn.microsoft.com/en-us/library/system.componentmodel.typeconverter.aspx

答案 2 :(得分:0)

问题是,'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