我想创建一个包含15个属性的类用于测试目的。如何在不复制和粘贴的情况下以编程方式生成文本?
public static class MyTestClass
{
public static string MyTestProperty1
{
get
{
return "My test1";
}
}
public static string MyTestProperty2
{
get
{
return "My test2";
}
}
<... so on.. >
}
答案 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);
答案 2 :(得分:0)
只需创建一个代码段,然后输入名称后跟2个标签即可使用它。这允许您更改属性的名称和类型,而无需更改/缩进片段的其余部分。 有关创建代码段和使用它们的信息,请参阅 http://msdn.microsoft.com/en-us/library/ms165394.aspx