2010-11-24 3 views
0

У меня есть массив объектов, который содержит в себе различные типы данных, такие как int, string, bool. Мне нужно получить отдельные записи от объекта.Пользовательский объект в .NET

Мне нужно сохранить их в классе.

Я знаю, что мне нужно использовать дженерики, как это сделать?

+0

Имеет ли массив информацию только для одного объекта, который вы хотите создать? – Seva 2010-11-24 15:54:54

ответ

1

Необходимо создать класс (например, MyRecord) со свойствами, которые вам нужны, а затем создать общий экземпляр List<MyRecord> для хранения экземпляров класса.

0

Дженерики не сработают для вас, поскольку они всего лишь магия компилятора. Вы можете посмотреть DynamicObject или ExpandoObject для того, что вам нужно.

В качестве альтернативы вы также можете создать динамический объект. Посмотрите на пространство имен 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) 
        }; 
    } 
} 
0

Если вы знаете позицию данных в массиве, то вы можете просто сделать это:

  1. Создать класс со всеми атрибутами, которые вы хотите
  2. myObject.name = array [0]; myObject.age = array [1];
Смежные вопросы