给定System.Type,为类定义生成源代码?

时间:2012-02-01 22:57:22

标签: c# .net reflection

在.NET中是否有办法在给定System.Type的情况下创建源代码类定义?

public class MyType
{
   public string Name { get; set; }
   public int Age { get; set; }
}


string myTypeSourceCode = GetSourceCode( typeof(MyType) );

基本上我正在寻找GetSourceCode()。

我意识到会有限制:如果有财产获取者/制定者或私人成员,则不包括来源,但我不需要。假设类型是数据传输对象,因此只需公开公共属性/字段。

我使用此功能的是自动生成的Web API代码示例。

2 个答案:

答案 0 :(得分:5)

如果您只想生成如您所示的伪接口代码,则可以迭代公共字段&像这样的属性:

string GetSourceCode(Type t)
{
    var sb = new StringBuilder();
    sb.AppendFormat("public class {0}\n{{\n", t.Name);

    foreach (var field in t.GetFields())
    {
        sb.AppendFormat("    public {0} {1};\n",
            field.FieldType.Name,
            field.Name);
    }

    foreach (var prop in t.GetProperties())
    {
        sb.AppendFormat("    public {0} {1} {{{2}{3}}}\n",
            prop.PropertyType.Name,
            prop.Name,
            prop.CanRead ? " get;" : "",
            prop.CanWrite ? " set; " : " ");
    }

    sb.AppendLine("}");
    return sb.ToString();
} 

对于类型:

public class MyType
{
    public int test;
    public string Name { get; set; }
    public int Age { get; set; }
    public int ReadOnly { get { return 1; } }
    public int SetOnly { set {} }
}

输出结果为:

public class MyType
{
   public Int32 test;
   public String Name { get; set; }
   public Int32 Age { get; set; }
   public Int32 ReadOnly { get; }
   public Int32 SetOnly { set; }
}

答案 1 :(得分:1)

试试.Net反编译器

以下是.net反编译器的一些链接 http://www.telerik.com/products/decompiler.aspx
http://www.jetbrains.com/decompiler/
http://www.devextras.com/decompiler/
http://wiki.sharpdevelop.net/ilspy.ashx
或者也许你可以在免费的时候找到旧版的.Net Reflector ...