C# 生成代码——有没有一种简单的方法可以获得可为null类型的正确字符串表示形式?
因此,我正在构建一个应用程序,它将使用C#和VB输出(取决于项目设置)生成大量代码 我有一个CodeTemplateEngine,有两个派生类VBTemplateEngine和CSharpTemplateEngine。这个问题涉及基于数据库表中的列创建属性签名。使用IDataReader的GetSchemaTable方法,我收集列的CLR类型,例如“System.Int32”,以及它是否可以为null。但是,我希望代码保持简单,而不是具有如下属性:C# 生成代码——有没有一种简单的方法可以获得可为null类型的正确字符串表示形式?,c#,vb.net,code-generation,C#,Vb.net,Code Generation,因此,我正在构建一个应用程序,它将使用C#和VB输出(取决于项目设置)生成大量代码 我有一个CodeTemplateEngine,有两个派生类VBTemplateEngine和CSharpTemplateEngine。这个问题涉及基于数据库表中的列创建属性签名。使用IDataReader的GetSchemaTable方法,我收集列的CLR类型,例如“System.Int32”,以及它是否可以为null。但是,我希望代码保持简单,而不是具有如下属性: public System.Int32
public System.Int32? SomeIntegerColumn { get; set; }
或
我想生成一个更简单的属性。我讨厌从无到有地构建类型字符串的想法,我更喜欢这样:
public int? SomeIntegerColumn { get; set; }
是否有任何内置的东西,例如在VBCodeProvider或CSharpCodeProvider类中,能够以某种方式为我解决这个问题
或者有没有办法从类型字符串(如System.Nullable'1[System.Int32]
)中获取类型别名int?
谢谢
更新:
这样就可以了,但我仍然担心将类型全名映射到别名的那种类型。这里有两个问题:
System.Int32
具有您喜欢的C#别名int
System.Nullable
可以使用C#中的?
符号表示,这是您喜欢的在将类型名称转换为字符串时,.NET Framework中没有包含可考虑这些方法。您必须自己动手。您可以使用CodeDom对泛型类型的支持和GetTypeOutput方法来完成此操作:
CodeTypeReference ctr;
if (/* you want to output this as nullable */)
{
ctr = new CodeTypeReference(typeof(Nullable<>));
ctr.TypeArguments.Add(new CodeTypeReference(typeName));
}
else
{
ctr = new CodeTypeReference(typeName);
}
string typeName = codeDomProvider.GetTypeOutput(ctr);
code类型参考中心;
如果(/*您想将其输出为可空*/)
{
ctr=新的代码类型引用(typeof(Nullable));
添加(新代码类型引用(类型名称));
}
其他的
{
ctr=新代码类型参考(类型名称);
}
字符串typeName=codeDomProvider.GetTypeOutput(ctr);
这将尊重特定于语言的类型关键字,例如C#
int
或VBInteger
,尽管它仍然会为您提供System.Nullable
,而不是int?
,这就是我的想法。感谢您的快速回复。CodeDomProvider.GetTypeOutput方法考虑了#1。但据我所知,你说得对。这会让我走到一半,这比我开始的要好。今晚我会试试,让你知道我的想法。谢谢虽然这种方法可能并不适合所有人,但它适合我,并回答了我的问题:“还有其他方法吗?”谢谢!
public int? SomeIntegerColumn { get; set; }
CodeTypeReference ctr;
if (/* you want to output this as nullable */)
{
ctr = new CodeTypeReference(typeof(Nullable<>));
ctr.TypeArguments.Add(new CodeTypeReference(typeName));
}
else
{
ctr = new CodeTypeReference(typeName);
}
string typeName = codeDomProvider.GetTypeOutput(ctr);