.net NET中的自定义对象
我有一个包含各种数据的对象数组,比如int、string、bool。我需要从对象中获取单个记录 我需要将它们存储在一个类中.net NET中的自定义对象,.net,console-application,.net,Console Application,我有一个包含各种数据的对象数组,比如int、string、bool。我需要从对象中获取单个记录 我需要将它们存储在一个类中 我知道我必须使用泛型,如何做到这一点?你需要用你需要的属性创建一个类(例如,MyRecord),然后创建一个泛型列表实例来保存类实例。泛型不适合你,因为它们只是编译器的魔法。您可以查看DynamicObject或ExpandooObject以了解所需内容 或者,也可以构建动态对象。查看System.CodeDom名称空间。这里有一个例子 public class Dynam
我知道我必须使用泛型,如何做到这一点?你需要用你需要的属性创建一个类(例如,
MyRecord
),然后创建一个泛型列表
实例来保存类实例。泛型不适合你,因为它们只是编译器的魔法。您可以查看DynamicObject或ExpandooObject以了解所需内容
或者,也可以构建动态对象。查看System.CodeDom名称空间。这里有一个例子
public class DynamicCodeCompiler
{
public static Type CompileCode(string code, string typeName)
{
var compiler = CodeDomProvider.CreateProvider("c#");
var compilerResults = compiler.CompileAssemblyFromSource(new CompilerParameters(), code);
if (compilerResults.Errors.HasErrors) return null;
return compilerResults.CompiledAssembly.GetType(typeName);
}
public static Type CreateClass(string nameSpaceName, string className, IDictionary<string, Type> properties)
{
var imports = new CodeNamespaceImportCollection();
foreach (var value in properties.Values)
{
imports.Add(new CodeNamespaceImport(value.Namespace));
}
imports.Add(new CodeNamespaceImport("System"));
var @class = new CodeTypeDeclaration(className)
{
IsClass = true
};
foreach (var propertyDefinition in properties)
{
var backingField = CreateBackingField(propertyDefinition.Key, propertyDefinition.Value);
@class.Members.Add(backingField);
var property = new CodeMemberProperty();
property.Attributes = MemberAttributes.Public;
property.Name = propertyDefinition.Key;
property.Type = new CodeTypeReference(propertyDefinition.Value);
property.GetStatements.Add(new CodeMethodReturnStatement(new CodeSnippetExpression(backingField.Name)));
property.SetStatements.Add(new CodeAssignStatement(new CodeSnippetExpression(backingField.Name),
new CodePropertySetValueReferenceExpression()));
@class.Members.Add(property);
}
var nameSpace = new CodeNamespace(nameSpaceName);
nameSpace.Types.Add(@class);
var assembly = new CodeCompileUnit();
//Add the namespace to the assembly.
assembly.Namespaces.Add(nameSpace);
var compilerParameters = new CompilerParameters(new[] { "mscorlib.dll", "System.dll" })
{GenerateInMemory = true};
//compilerParameters.ReferencedAssemblies.Add("System.dll");
var compiler = CodeDomProvider.CreateProvider("c#");
var compilerResults = compiler.CompileAssemblyFromDom(compilerParameters, assembly);
if (compilerResults.Errors.HasErrors)
{
foreach (var error in compilerResults.Errors)
{
Console.WriteLine(error);
}
return null;
}
var codeText = new StringWriter();
compiler.GenerateCodeFromNamespace(nameSpace, new IndentedTextWriter(codeText), new CodeGeneratorOptions());
return compilerResults.CompiledAssembly.GetType(string.Format("{0}.{1}", nameSpaceName, className));
}
private static CodeMemberField CreateBackingField(string name, Type type)
{
return new CodeMemberField
{
Attributes = MemberAttributes.Private,
Name = string.Format("_{0}", name),
Type = new CodeTypeReference(type)
};
}
}
公共类动态反编译器
{
公共静态类型编译器代码(字符串代码、字符串类型名称)
{
var compiler=CodeDomProvider.CreateProvider(“c#”);
var compilerResults=compiler.compileAsemblyFromSource(新的CompilerParameters(),代码);
if(compilerResults.Errors.HasErrors)返回null;
返回compilerResults.CompiledAssembly.GetType(typeName);
}
公共静态类型CreateClass(字符串名称空间名称、字符串类名、IDictionary属性)
{
var imports=新的CodeNamespaceImportCollection();
foreach(properties.Values中的var值)
{
Add(新的CodeNamespaceImport(value.Namespace));
}
添加(新的CodeNamespaceImport(“系统”));
var@class=新代码类型声明(className)
{
IsClass=true
};
foreach(属性中的var propertyDefinition)
{
var backingField=CreateBackingField(propertyDefinition.Key,propertyDefinition.Value);
@class.Members.Add(backingField);
var属性=新的CodeMemberProperty();
property.Attributes=MemberAttributes.Public;
property.Name=propertyDefinition.Key;
property.Type=新的CodeTypeReference(propertyDefinition.Value);
添加(新的CodeMethodReturnStatement(新的CodeSnippetExpression(backingField.Name));
property.SetStatements.Add(新的CodeAssignStatement(新的CodeSnippetExpression)(backingField.Name)),
新的CodePropertySetValueReferenceExpression());
@类。成员。添加(属性);
}
var nameSpace=新的代码名称空间(nameSpaceName);
nameSpace.Types.Add(@class);
var assembly=new CodeCompileUnit();
//将命名空间添加到程序集。
assembly.Namespaces.Add(名称空间);
var compilerParameters=新的编译器参数(新[]{“mscorlib.dll”,“System.dll”})
{GenerateInMemory=true};
//compilerParameters.ReferencedAssemblys.Add(“System.dll”);
var compiler=CodeDomProvider.CreateProvider(“c#”);
var compilerResults=compiler.compileasemblyFromDOM(compilerParameters,assembly);
if(compilerResults.Errors.HasErrors)
{
foreach(compilerResults.Errors中的变量错误)
{
控制台写入线(错误);
}
返回null;
}
var codeText=新的StringWriter();
GenerateCodeFromNamespace(名称空间,新的IndentedTextWriter(codeText),新的CodeGeneratorOptions());
返回compilerResults.CompiledAssembly.GetType(string.Format(“{0}.{1}”,nameSpaceName,className));
}
私有静态CodeMemberField CreateBackingField(字符串名称,类型)
{
返回新的CodeMemberField
{
Attributes=MemberAttributes.Private,
Name=string.Format(“{0}”,Name),
类型=新代码类型引用(类型)
};
}
}
如果您知道数据在数组中的位置,则只需执行以下操作:
数组中是否只有一个要创建的对象的信息?对于我个人来说,要理解这个问题,需要更具体一些。