所以我正在构建一个应用程序,它将使用C#和VB输出进行大量代码生成(取决于项目设置)。
我有一个CodeTemplateEngine,有两个派生类VBTemplateEngine和CSharpTemplateEngine。此问题涉及基于数据库表中的列创建属性签名。使用IDataReader的GetSchemaTable方法,我收集列的CLR类型,例如“System.Int32”,以及它是否为IsNullable。但是,我想保持代码简单,而不是具有看起来像的属性:
public System.Int32? SomeIntegerColumn { get; set; }
或
public Nullable<System.Int32> SomeIntegerColumn { get; set; },
使用此函数(来自我的VBTemplateEngine)解析属性类型,
public override string ResolveCLRType(bool? isNullable, string runtimeType)
{
Type type = TypeUtils.ResolveType(runtimeType);
if (isNullable.HasValue && isNullable.Value == true && type.IsValueType)
{
return "System.Nullable(Of " + type.FullName + ")";
// or, for example...
return type.FullName + "?";
}
else
{
return type.FullName;
}
},
我想生成一个更简单的属性。我讨厌从零构建一个Type字符串的想法,我宁愿有类似的东西:
public int? SomeIntegerColumn { get; set; }
在任何地方都有内置的内容,例如在VBCodeProvider或CSharpCodeProvider类中会以某种方式为我处理这个问题吗?
或者有没有办法从int?
这样的类型字符串中获取System.Nullable'1[System.Int32]
的类型别名?
谢谢!
更新
Found something会这样做,但我仍然对这种类型的全名到它们的别名的映射保持警惕。
答案 0 :(得分:4)
您可以使用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);
这会尊重特定于语言的类型关键字,例如C#int
或VB Integer
,但它仍然会为您提供System.Nullable<int>
而不是int?
。
答案 1 :(得分:2)
这里有两个问题:
System.Int32
包含您喜欢的C#别名int
。System.Nullable
可以使用您喜欢的C#中的?
符号表示。.NET Framework中没有任何方法可以在将类型名称转换为字符串时将这些方法考虑在内。你将不得不自己动手。