以编程方式将文本创建到另一个文件

时间:2012-10-18 18:49:34

标签: c#

我想创建一个包含15个属性的类用于测试目的。如何在不复制和粘贴的情况下以编程方式生成文本?

public static class MyTestClass
{
    public static string MyTestProperty1
    {
        get
        {
            return "My test1";
        }
    }

    public static string MyTestProperty2
    {
        get
        {
            return "My test2";
        }
    }
<... so on.. >
}

3 个答案:

答案 0 :(得分:2)

您可以使用TypeBuilder手动构建类型:

// read property names from file
string[] propertyNames = { "MyTestProperty1", "MyTestProperty2" };

AssemblyName name = new AssemblyName("Foo");
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain
   .DefineDynamicAssembly(name, AssemblyBuilderAccess.Run);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("Bar");
TypeBuilder typeBuilder = 
   moduleBuilder.DefineType("MyTestClass", TypeAttributes.Public);

foreach (var propertyName in propertyNames)
{
    PropertyBuilder property = typeBuilder.DefineProperty(
         propertyName,
         System.Reflection.PropertyAttributes.HasDefault, 
         typeof(string), 
         null);        
    MethodBuilder getter = typeBuilder.DefineMethod(
         "get_" + propertyName,
         MethodAttributes.Public | MethodAttributes.SpecialName, 
         typeof(string), 
         Type.EmptyTypes);
    ILGenerator generator = getter.GetILGenerator();
    // generate default value for property
    generator.Emit(OpCodes.Ldstr, propertyName.Replace("Property", " "));
    generator.Emit(OpCodes.Ret);
    property.SetGetMethod(getter);
}

Type type = typeBuilder.CreateType();

现在您可以使用您的类型:

object obj = Activator.CreateInstance(type);

foreach (var propertyName in propertyNames)
{
    PropertyInfo pi = type.GetProperty(propertyName);
    Console.WriteLine(pi.GetValue(obj));
}

dynamic testObj = obj;
Console.WriteLine(testObj.MyTestProperty2);

实际上,您可以进一步指定某些配置文件中的属性名称,类型和默认值。我把它留给你:)

答案 1 :(得分:0)

如果属性名称和返回值与您说的一样简单,您可以编写一个简单的控制台应用程序来执行以下操作...
注意:代码未经过测试。

int numberOfProperties = 15;

IList<string> code = new List<string>();
code.Add("public static class MyTestClass");
code.Add("{");

for (int i = 0; i < numberOfProperties; i++)
{
    code.Add("public static string MyTestProperty" + i);
    code.Add("{");
    code.Add("get");
    code.Add("{");
    code.Add("return \"My test\" + i + "";");
    code.Add("}");
    code.Add("}");
}

code.Add("}");

File.AppendAllLines(<path>, code);

如果需要更复杂,可以使用C#CodeDOM。使用CodeDOM,您甚至可以compile代码。

答案 2 :(得分:0)

只需创建一个代码段,然后输入名称后跟2个标签即可使用它。这允许您更改属性的名称和类型,而无需更改/缩进片段的其余部分。 有关创建代码段和使用它们的信息,请参阅 http://msdn.microsoft.com/en-us/library/ms165394.aspx