Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.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# 生成代码——有没有一种简单的方法可以获得可为null类型的正确字符串表示形式?_C#_Vb.net_Code Generation - Fatal编程技术网

C# 生成代码——有没有一种简单的方法可以获得可为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

因此,我正在构建一个应用程序,它将使用C#和VB输出(取决于项目设置)生成大量代码

我有一个CodeTemplateEngine,有两个派生类VBTemplateEngine和CSharpTemplateEngine。这个问题涉及基于数据库表中的列创建属性签名。使用IDataReader的GetSchemaTable方法,我收集列的CLR类型,例如“System.Int32”,以及它是否可以为null。但是,我希望代码保持简单,而不是具有如下属性:

    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
    或VB
    Integer
    ,尽管它仍然会为您提供
    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);