C# CodeDom中的Instace对象及其使用方法

C# CodeDom中的Instace对象及其使用方法,c#,dynamic,codedom,C#,Dynamic,Codedom,我创建了一个类测试,其中代码、名称和地址作为_Code、_Name和_Address的属性。下面的代码由CodeDom使用 CSharpCodeProvider provider = new CSharpCodeProvider(); // Build the parameters for source compilation. CompilerParameters cp = new CompilerParameters(); // Add an assembly reference. cp.

我创建了一个类测试,其中代码、名称和地址作为_Code、_Name和_Address的属性。下面的代码由CodeDom使用

CSharpCodeProvider provider = new CSharpCodeProvider();

// Build the parameters for source compilation.
CompilerParameters cp = new CompilerParameters();
// Add an assembly reference.
cp.ReferencedAssemblies.Add("System.dll");

cp.GenerateExecutable = false;

cp.GenerateInMemory = true;

cp.OutputAssembly = "OutputAssembly";

//
//
CodeCompileUnit compileUnit = new CodeCompileUnit();
CodeNamespace namespaces = new CodeNamespace("Models");
compileUnit.Namespaces.Add(namespaces);

// Define a class
CodeTypeDeclaration customClass = new CodeTypeDeclaration("Test");
customClass.IsClass = true;
customClass.TypeAttributes = System.Reflection.TypeAttributes.Public;

CodeMemberField field1 = new CodeMemberField("System.String", "_code");
field1.Attributes = MemberAttributes.Private;
customClass.Members.Add(field1);

CodeMemberProperty propertyField1 = new CodeMemberProperty();
propertyField1.Attributes = MemberAttributes.Public;
propertyField1.Name = "Code";
propertyField1.HasGet = true;
propertyField1.Type = new CodeTypeReference("System.String");
propertyField1.GetStatements.Add(new CodeMethodReturnStatement(
    new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), "_code")));
customClass.Members.Add(propertyField1);

CodeMemberField field2 = new CodeMemberField("System.String", "_name");
field2.Attributes = MemberAttributes.Private;
customClass.Members.Add(field2);

CodeMemberProperty propertyField2 = new CodeMemberProperty();
propertyField2.Attributes = MemberAttributes.Public;
propertyField2.Name = "Name";
propertyField2.HasGet = true;
propertyField2.Type = new CodeTypeReference("System.String");
propertyField2.GetStatements.Add(new CodeMethodReturnStatement(
    new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), "_name")));
customClass.Members.Add(propertyField2);

CodeMemberField field3 = new CodeMemberField("System.String", "_address");
field3.Attributes = MemberAttributes.Private;
customClass.Members.Add(field3);

CodeMemberProperty propertyField3 = new CodeMemberProperty();
propertyField3.Attributes = MemberAttributes.Public;
propertyField3.Name = "Address";
propertyField3.HasGet = true;
propertyField3.Type = new CodeTypeReference("System.String");
propertyField3.GetStatements.Add(new CodeMethodReturnStatement(
    new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), "_address")));
customClass.Members.Add(propertyField3);

namespaces.Types.Add(customClass);

CompilerResults cr = provider.CompileAssemblyFromDom(cp, compileUnit);
if (cr.Errors.Count > 0)
{
    ApplicationException exception = new ApplicationException("Error building assembly");
    foreach (CompilerError ce in cr.Errors)
    {
        exception.Data.Add(ce.ToString(), ce);
    }

    throw exception;
}
类已成功创建。但当我创建类Test的实例时,它返回: {Name=“CultureInfo”FullName=“System.Globalization.CultureInfo”}

下面的代码将值设置为properties,但我始终无法访问它,从而导致上述错误

instType.GetProperty("Code").SetValue(instance, "Code_value", null);
instType.GetProperty("Name").SetValue(instance, "Name_value", null);
instType.GetProperty("Address").SetValue(instance, "Address_value", null);

var listType = typeof(List<>);
var genericListType = listType.MakeGenericType(instType);
var instGenericListType = (IList)Activator.CreateInstance(genericListType);

instGenericListType.Add(instance);

实例现在已成功创建。但是我仍然不能设置属性的值,我在使用SetValue时出错实际上,我在生成属性时错过了set操作,在代码中,我只是设置了get操作。这是集合1的代码:

propertyField2.SetStatements.Add(new CodeAssignStatement(
            new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "_name"), new CodePropertySetValueReferenceExpression()));
object instance = assembly.CreateInstance("Models.Test", true, BindingFlags.Default, null, null, null, null);
propertyField2.SetStatements.Add(new CodeAssignStatement(
            new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "_name"), new CodePropertySetValueReferenceExpression()));