Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#代码生成变量作为类型_C#_Code Generation - Fatal编程技术网

C#代码生成变量作为类型

C#代码生成变量作为类型,c#,code-generation,C#,Code Generation,在现有应用程序中,生成代码以执行强制转换,如下所示:(类型也是生成的类,我提供了一个示例,其中包含object和string) 当o的类型为int时,将抛出InvalidCastException。因此,我想将代码更改为: object o; string s = o as string; 然后检查字符串s是否为空 System.CodeDom用于执行代码生成。强制转换是使用CodeCastExpression类生成的 我找不到将变量生成为类型的方法way。。。有人能帮我吗?谢谢 也许你想试试

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

当o的类型为
int
时,将抛出
InvalidCastException
。因此,我想将代码更改为:

object o;
string s = o as string;
然后检查
字符串s
是否为空

System.CodeDom
用于执行代码生成。强制转换是使用
CodeCastExpression
类生成的


我找不到将
变量生成为类型的方法
way。。。有人能帮我吗?谢谢

也许你想试试这个:

//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”运算符的信息,请参阅。

问题是,“as”运算符不能与非引用类型一起使用

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
例如:

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;
    }
}
公共类转换器思想
{
公共T转换(对象o)
T:在哪里上课
{
返回o作为T;
}
公共T转换(对象o,T目标对象BJ)
T:在哪里上课
{
返回o作为T;
}
}
这应该适用于大多数情况。您可以执行从任何对象到另一个引用类型的as转换

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
SomeClass x=newconverterthingy().Convert(newexpandoobject());
//x为空
SomeClass x=null;
x=新的转换器thingy().Convert(新的ExpandoObject(),x);
//x为null,则从参数推断x的类型

如何使用
System.ComponentModel.TypeConverter
。 它有方法检查它是否
CanConvertFrom(Type)
CanConvertTo(Type)
,并有“通用”ConvertTo方法,该方法在中接受对象并返回对象:

public Object ConvertTo(
    Object value,
    Type destinationType
)

看看这里:

也许您可以处理上面描述的其他类型?我认为您不能使用CodeDom来编写[variable as Type]——根据我所读的内容,这是不受支持的,因为“as”关键字是特定于C的。我不确定这是否完全准确。正如我在原始问题中更新的那样,使用的类型也是在运行时生成的类。。。对不起,我说的模棱两可。谢谢你的回答很好,但现在我正努力在我的代码中获得正确的
is
运算符。。。你能帮忙吗?我没有亲自做过,但我已经用一个链接更新了答案,链接到一个页面,上面有关于如何完成这项任务的说明。很高兴你让它工作了,即使它不是我的答案。不客气。好的,纠正我如果我错了,ConverterThingy不是生成的助手类?正确。您可以创建一个帮助器类来更好地执行转换,而不是生成代码来执行转换。如果您不能直接访问泛型调用的类型,那么可以使用一些技巧来获得它。我将更新类以反映这一点。老实说,这个解决方案在我看来有点过头了。。我现在正在尝试乔希的建议。谢谢你的回答!