2010-11-24 35 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];