标签: code-generation

如何让Visual Studio使用系统类型(Int32)而不是内置别名(int)生成代码

我可以让Visual Studio将内置别名转换为系统类型吗?例如,如果我定义以下接口

public interface IExample
{
    Int32 DoWork(String input);
}
Run Code Online (Sandbox Code Playgroud)

并使用VS自动生成界面,我得到了内置类型.

public class Demo : IExample
{
    public int DoWork(string input) { }
}
Run Code Online (Sandbox Code Playgroud)

我希望那些自动更改为系统类型

public class Demo : IExample
{
    public Int32 DoWork(String input) { }
}
Run Code Online (Sandbox Code Playgroud)

我不是在寻找一个完整的可安装解决方案,只是一个起点.我可以在VS中编写一个连接文本完成或保存的脚本吗?我应该编写一个具有项目上下文菜单项的加载项 - "将别名转换为系统类型"吗?


注意:我更喜欢系统类型,因为它们像其他类型一样由VS格式化.内置别名的格式与关键字类似.此外,它是我目前工作的编码风格指南.

更新:从MS可以清楚地看出,现有的VS代码生成将始终生成内置别名.

code-generation coding-style visual-studio

8
推荐指数
1
解决办法
591
查看次数

你能改变VS Win Forms设计器代码生成吗?

我们实施了新的编码标准,要求我们的私人会员拥有领先的下划线.像这样:

private System.Windows.Forms.Label _label;
Run Code Online (Sandbox Code Playgroud)

不幸的是,当您将新标签拖到表单上时,VS将在下面输出默认值:

private System.Windows.Forms.Label label1;
Run Code Online (Sandbox Code Playgroud)

有没有办法将默认值更改为:

private System.Windows.Forms.Label _label1;
Run Code Online (Sandbox Code Playgroud)

这适用于所有控件,而不仅仅是标签,是的,它们将从代码中使用.

干杯,

普拉门

c# code-generation windows-forms-designer visual-studio winforms

8
推荐指数
3
解决办法
2251
查看次数

如何生成源代码以创建我正在调试的对象?

我的典型场景:

  1. 我工作的遗留代码有一个只有生产中的客户端才有的错误
  2. 我附加一个调试器,并找出如何重现在这个问题上他们的给定系统的输入.但是,我不知道为什么错误发生了.
  3. 现在我想在我的本地系统上编写一个自动化测试来尝试重现然后修复bug

最后一步真的很难.输入可能非常复杂,并且有很多数据.手动创建输入(例如:P p = new P(); p.setX("x"); p.setY("x");想象这样做1000次以创建对象)非常繁琐且容易出错.事实上你可能会注意到我刚给出的例子中有一个拼写错误.

是否有一种自动方式从我的调试器中的断点获取字段并生成将创建该对象的源代码,以相同的方式填充?

我唯一想到的就是序列化这个输入(例如使用Xstream).我可以将其保存到文件中并在自动测试中将其读回.这有一个主要问题:如果类以某种方式更改(例如:重命名了字段/ getter/setter名称),我将无法再反序列化该对象.换句话说,测试非常脆弱.

java testing automated-tests code-generation

8
推荐指数
1
解决办法
700
查看次数

Java Builder生成器问题

在我的一个项目中,我有两个包含DTO的包,POJO只有吸气剂和二传手.虽然重要的是它们是简单的Java bean(例如,因为Apache CXF使用它们来创建Web服务XSD等),但它也很糟糕且容易出错.

Foo foo = new Foo();
foo.setBar("baz");
foo.setPhleem(123);
return foo;
Run Code Online (Sandbox Code Playgroud)

我更喜欢流畅的接口和构建器对象,因此我使用maven/gmaven自动为DTO创建构建器.所以对于上面的代码,FooBuilder会自动生成一个,我可以像这样使用:

Foo foo = new FooBuilder()
           .bar("baz")
           .phleem(123)
           .build();
Run Code Online (Sandbox Code Playgroud)

我还自动为生成的Builders生成单元测试.单元测试将生成上述两个代码(构建器版本和非构建器版本),并声明两个版本在equals()和的方面都是等效的hashcode().我可以实现的方法是拥有一个全局可访问的Map,其中包含每种属性类型的默认值.像这样的东西:

public final class Defaults{
    private Defaults(){}
    private static final Map<Class<?>, Object> DEFAULT_VALUES =
        new HashMap<Class<?>, Object>();
    static{
        DEFAULT_VALUES.put(String.class, "baz");
        // argh, autoboxing is necessary :-)
        DEFAULT_VALUES.put(int.class, 123);
        // etc. etc.
    }
    public static getPropertyValue(Class<?> type){
        return DEFAULT_VALUES.get(type);
    }
}
Run Code Online (Sandbox Code Playgroud)

另一个非平凡的方面是pojos有时会有收集成员.例如:

foo.setBings(List<Bing> bings)
Run Code Online (Sandbox Code Playgroud)

但在我的构建器中,我希望从这种情况生成两种方法:set方法和add方法:

fooBuilder.bings(List<Bing> bings); // set method
fooBuilder.addBing(Bing bing); // add …
Run Code Online (Sandbox Code Playgroud)

java code-generation builder-pattern

8
推荐指数
1
解决办法
3021
查看次数

Xcode4自动生成@property声明以及随之而来的所有声明

当我使用Xcode 3时,我使用在网络上找到的perl脚本配置它,这允许我自动为新实例变量生成@property,@synthesize和dealloc代码.但是Xcode 4没有那个User Scripts菜单.

有没有办法为Xcode 4插入这些类型的用户脚本,或者Xcode 4是否有自动生成这些内容的新功能?(我看了,但找不到一个).

我不是在谈论与IBOutlets的关联.我知道我可以从xib拖动它将为IBOutlets创建所有正确的东西,但我正在寻找能为任何实例变量创建@property,@synthesize和dealloc代码的东西.

谢谢,肯尼

xcode code-generation properties xcode4

8
推荐指数
1
解决办法
2270
查看次数

如何从PowerShell脚本触发T4模板

在我的VS2010解决方案,我已经根据T4Scaffolding的NuGet设置PowerShell脚本和T4模板的,一切工作脚手架罚款及相关T4的,但在我的剧本之一,我需要触发位于另一个项目T4模板.

这个有什么简单的Powershel cmdlet吗?只运行模板而不传递任何参数或值.

谢谢.

powershell t4 code-generation visual-studio-2010

8
推荐指数
1
解决办法
2780
查看次数

在构建服务器上运行TextTransform.exe(T4)

我正在尝试设置一个进程,我的T4模板将在构建服务器上进行转换(Visual Studio未安装在那里).

我已经阅读了所有在线参考文献,但无法获得显示如何执行此操作的明确来源.

具体来说,这是我遇到的两个问题:

  • TextTransform.exe抛出有关缺少DLL的错误:

C:\ TeamCity的\ buildAgent \工作\ AppSettings.tt(0,0):错误CS0006:编译转型:元数据文件"Microsoft.VisualStudio.TextTemplating.Interfaces.10.0,版本= 10.0.0.0,文化=中立,公钥= b03f5f7f11d50a3a '无法找到

使用gacutil注册DLL文件修复了这个问题,虽然我想避免这一步.

  • 在Visual Studio外部运行时,使用Host.ResolvePath(string)方法不返回任何值.

此方法有助于确定模板用作其数据源的.txt文件的完整路径.没有它,无法在构建服务器上找到此文件.

任何帮助将在运行中受到赞赏.

编辑:打开一个MS CONNECT问题:https://connect.microsoft.com/VisualStudio/feedback/details/744137/texttransform-exe-does-not-work-without-vs2010-installed

参考资料我检查过:

.net c# t4 code-generation visual-studio-2010

8
推荐指数
1
解决办法
5239
查看次数

实体框架5首先使用代码进行密钥命名

当我的密钥名称(索引,主键和外键)由Add-Migration生成时,我不能有[.](句点),所以我尝试编写CSharpMigrationCodeGenerator,但不幸的是,这似乎不允许您要更改外键或索引名称.主键名称可以设置为覆盖create table的一部分:

protected override void Generate(
    CreateTableOperation createTableOperation, IndentedTextWriter writer)
    {
        createTableOperation.PrimaryKey.Name = "USE THIS NAME";
        base.Generate(createTableOperation, writer);
    }
Run Code Online (Sandbox Code Playgroud)

但我真正需要的是一种方法来确保它刚刚删除完全停止(这意味着覆盖自定义名称生成器) - 但我看不到如何做到这一点.

c# code-generation entity-framework-5

8
推荐指数
1
解决办法
594
查看次数

从标头自动生成C代码

我想生成头文件中定义的空过程.理想情况下,它们应该为指针返回NULL,为整数等返回0,并且在理想的世界中,还要向stderr打印调用哪个函数.

这样做的动机是需要实现一个包装器,它将复杂的现有API(头文件)的子集调整到另一个库.只需要委托API中的少量程序,但不清楚哪些程序.所以我希望使用一种迭代方法,在这种情况下,我针对这个自动生成的包装器运行,看看有什么叫做,用委托来实现,然后重复.

我看到从头部自动生成C++文件?但答案似乎是C++特定的.

因此,对于那些需要用简单术语拼写的问题的人来说,如何在给定头文件的情况下自动生成这样的实现?我更喜欢现有的工具 - 我目前对一个简单解决方案的最佳猜测是使用pycparser.

更新谢谢你们.两个好的答案.还发布了我目前的黑客.

c code-generation

8
推荐指数
1
解决办法
1989
查看次数

无法使用AutoValue和IntelliJ解析符号

我一直在尝试为IntelliJ的注释处理找到正确的设置,以便它与Gradle的构建过程共存.

每当我使用IntelliJ构建时,我都无法识别gradle-apt-plugin中生成的源代码.

我对我的项目的要求是:

  • IntelliJ和Gradle之间的构建应该是无缝的,不会干扰彼此的过程
  • 我需要使用IntelliJ的每个源集选项创建单独的模块
  • 我需要使用IntelliJ的基于文件夹的结构
  • IntelliJ需要能够识别并自动完成AutoValue类

以下是使用IntelliJ 2017.2.4和Gradle 3.5重现问题的MCVE的步骤:

  • 从IntelliJ创建一个新的Gradle项目
  • 选中"为每个源集创建单独的模块"选项
  • 打开build.gradle文件:
  • 添加以下plugins块:

plugins {
    id 'java'
    id 'net.ltgt.apt' version '0.12'
}
Run Code Online (Sandbox Code Playgroud)
  • 添加以下dependencies块

dependencies {
    compileOnly 'com.google.auto.value:auto-value:1.5'
    apt 'com.google.auto.value:auto-value:1.5'
}
Run Code Online (Sandbox Code Playgroud)
  • 转到设置→构建,执行,部署→注释处理器
  • 选中" 启用注释处理"
  • 创建一个类:

@AutoValue
public abstract class GeneratedSourcesTest {

    static GeneratedSourcesTest create(String field) {
        return new AutoValue_GeneratedSourcesTest(field);
    }

    public abstract String field();
}
Run Code Online (Sandbox Code Playgroud)
  • 在IntelliJ上运行Build→Build Project
  • 打开GeneratedSourcesTest类,在静态工厂方法,一切编译好,但我得到错误:

cannot resolve symbol ‘AutoValue_GeneratedSourcesTest’

如何 …

java code-generation intellij-idea auto-value gradle-apt-plugin

8
推荐指数
2
解决办法
5381
查看次数