2010-11-24 16 views
0

Ich habe ein Array von Objekten, die verschiedene Arten von Daten enthält, wie Int, String, Bool. Ich muss die einzelnen Datensätze von dem Objekt abrufen.Benutzerdefiniertes Objekt in .NET

Ich muss sie in einer Klasse speichern.

Ich weiß, ich muss Generika verwenden, wie man das macht?

+0

hat das Array Informationen nur für ein Objekt, das Sie erstellen möchten? – Seva

+4

für mich persönlich, um die Frage zu verstehen, müssen Sie genauer sein. – akonsu

Antwort

1

Sie müssen eine Klasse (z. B. MyRecord) mit den Eigenschaften erstellen, die Sie benötigen, und dann eine generische Instanz erstellen, die die Klasseninstanzen enthält.

0

Generics würde nicht für Sie arbeiten, da sie nur Compiler Magie sind. Sie können DynamicObject oder ExpandoObject für Ihre Anforderungen verwenden.

Alternativ können Sie auch ein dynamisches Objekt erstellen. Sehen Sie sich den System.CodeDom-Namespace an. Hier ist ein Beispiel

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

Wenn Sie die Position der Daten im Array kennen, dann können Sie einfach tun:

  1. Erstellen Sie eine Klasse mit allen Attributen Sie
  2. myObject.name wollen = Array [0]; myObject.age = Array [1];
Verwandte Themen