2010-11-24 10 views
0

私はint、string、boolのようなさまざまな種類のデータを含むオブジェクトの配列を持っています。私はオブジェクトから個々のレコードを取得する必要があります。.NETのカスタムオブジェクト

私はそれらをクラスに保存する必要があります。

私はジェネリックスを使用する必要があることを知っています、それを行う方法?

+0

アレイには、作成するオブジェクトが1つのみの情報が含まれていますか?私にとっては – Seva

+4

、個人的には、質問を理解するためには、より具体的にする必要があります。 – akonsu

答えて

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を持つクラスを作成します。 =配列[0]; myObject.age = array [1];
関連する問題