自动生成C#类

3
我经常发现我正在编写一个类似于以下内容的类(但成员数量,成员类型等不同)。是否可以自动、轻松且免费地完成这个工作?
因此,我想提供参数“Foo”、“int”、“apples”、“bool”、“banana”、“Bar”和“clementine”,并让代码的其余部分为我生成。
public class Foo
{
   public Foo(int apples, bool banana, Bar clementine)
   {
      m_Apples = apples;
      m_Banana = banana;
      m_Clementine = clementine;
   }

   public int Apples
   {
      get { return m_Apples; }
      set { m_Apples = value; }
   }

   public bool Banana
   {
      get { return m_Banana; }
      set { m_Banana = value; }
   }

   public Bar Clementine
   {
      get { return m_Clementine; }
      set { m_Clementine = value; }
   }

   private int m_Apples;
   private bool m_Banana;
   private Bar m_Clementine;
}
7个回答

5

看看T4引擎。它从VS2005开始就已经包含了。


3
如果您升级到C# 3.5,就可以缩短所需编写的代码量。
例如,您只需要这样做:
public class Foo
{
  public int Apples { get; set; }
  public bool Banana { get; set; }
  public Bar Clementine { get; set; }
}

var myFoo = new Foo { Apples = 1, Banana = true, Clementine = new Bar() };

或者,您仍然可以拥有构造函数,但不必添加所有私有字段。这很容易输入,并且使用代码片段或resharper更快。缺点是,像这样,您无法在没有更多代码的情况下验证参数输入。这有点取决于谁将消耗您的类以及int Apples是否明确设置而不仅仅是0的重要性。


2
您还可以使用C#代码片段,这使得创建代码过程非常简单,例如prop、ctor、propdp、prope。无论如何,这是一个列表,可能会有所帮助。
C# 代码片段链接:C# Snippets

代码片段能让我拥有可变数量的成员吗?有时我可能想要3个成员,但其他时候我可能想要2个、4个或6个。 - Tim Gradwell
如果你正在使用C# 2.0,那么prop代码片段将会添加属性及其成员,类似于:private string _member; public string Member { get { return _member; } set { _member = value; } } - Carlo
通过多次使用代码片段,您可以拥有可变数量的成员。 - Frank Schwieterman

1
你可以使用自动属性,如下所示:
   public Bar Clementine
   {
      get;
      set;
   }

这至少可以为您节省一些打字时间。

另外,您应该购买Resharper - 我知道您说要免费的,但是一旦您意识到它可以为您节省多少时间,它基本上就是免费的。


1

这可以通过 System.CodeDom 中的类来完成。请参阅 CodeDomProvider 的帮助文档以获取示例。我曾使用它来创建一个基于类型库中定义的 IDL 枚举的标志属性的托管枚举。


1

XSD 工具可以帮助您完成此操作。只需编写代表您的对象的模式,XSD 将生成相应的类。


0

对于您提供的示例,以下内容在功能上是等效的:

public class Foo {
    public int Apples;
    public bool Banana;
    public Bar Clementine;
}

new Foo { Apples = 1, Banana = false, Clementine = new Bar() };

不知道你要解决什么问题,很难提出更好的替代方案。这些是什么类型的对象?消息?数据文件的运行时表示?

你可能想考虑使用类似元组或原始数组的替代表示。


我有一种感觉,它们在功能上并不等同。如果你将我的类的实例传递给属性网格,这个网格中会显示3个属性,但是如果你将你的类的实例传递给属性网格,你将看不到任何属性,因为属性和公共字段并不相同...我想。 - Tim Gradwell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接