.net NET中的自定义对象

.net NET中的自定义对象,.net,console-application,.net,Console Application,我有一个包含各种数据的对象数组,比如int、string、bool。我需要从对象中获取单个记录 我需要将它们存储在一个类中 我知道我必须使用泛型,如何做到这一点?你需要用你需要的属性创建一个类(例如,MyRecord),然后创建一个泛型列表实例来保存类实例。泛型不适合你,因为它们只是编译器的魔法。您可以查看DynamicObject或ExpandooObject以了解所需内容 或者,也可以构建动态对象。查看System.CodeDom名称空间。这里有一个例子 public class Dynam

我有一个包含各种数据的对象数组,比如int、string、bool。我需要从对象中获取单个记录

我需要将它们存储在一个类中


我知道我必须使用泛型,如何做到这一点?

你需要用你需要的属性创建一个类(例如,
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),
类型=新代码类型引用(类型)
};
}
}

如果您知道数据在数组中的位置,则只需执行以下操作:

  • 创建一个包含所有所需属性的类
  • myObject.name=数组[0];myObject.age=数组[1]
    数组中是否只有一个要创建的对象的信息?对于我个人来说,要理解这个问题,需要更具体一些。