给定一个表示类型的字符串,我需要知道它是值还是引用类型

时间:2011-09-27 02:10:10

标签: c# types t4

我正在写一个T4模板并且卡在这上面。如果模板的消费者写道:

Please generate stuff for: string myString

我需要生成

if (myString != null)
{
    DoStuffWith(myString)
}

然而如果他们写了

Please generate stuff for: int myInt

我需要简单地生成

DoStuffWith(myInt)

这也需要使用自定义值/引用类型。

如果我强迫模板消费者写System.String myStringSystem.Int32 myInt,我想这可以毫无困难地完成;可能有一些隐藏在框架中的GetTypeFromFullTypeName方法。但我不想让他们这样做。

关于我的T4模板如何获取此信息的任何想法,所以我可以有条件地生成正确的代码?

2 个答案:

答案 0 :(得分:3)

  1. 获取Type班级的相应实例(例如Type.GetTypeAssembly.GetType)。

  2. 检查IsValueType属性。

  3. “短名称”类型的数量非常有限,它们实际上是C#关键字。所以你可以使用case语句,例如case "string": return typeof (string);

    您还需要?的一些规则,以及查找泛型类的特定具体版本(递归会很有帮助)。请勿尝试将int?翻译为System.Nullable``1[System.Int32],而是使用typeof(System.Nullable<>).MakeGenericType(FindType("int"))

答案 1 :(得分:1)

即使对于值类型,也可以始终发出空检查。这不是编译器错误,而是生成warning,您可以suppress

#pragma warning disable CS0472 
if (myInt != null)
{
    DoStuffWith(myInt)
}
#pragma warning restore CS0472