1

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

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

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

3 回答 3

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);

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

于 2012-10-18T19:35:47.707 回答
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,您甚至可以编译代码。

于 2012-10-18T19:03:13.860 回答
0

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

于 2012-10-18T19:08:38.123 回答