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 に答える