在现有的应用程序中,生成代码以执行强制转换,如下所示:(类型也是生成的类,我提供的示例仅包含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
方式的方法......有人可以帮助我吗?谢谢!
答案 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