2010-11-24 11 views
0

int, string, bool과 같이 다양한 종류의 데이터가 포함 된 객체 배열이 있습니다. 개체에서 개별 레코드를 가져와야합니다..NET의 사용자 정의 객체

클래스에 저장해야합니다.

제네릭을 사용해야하는 이유는 무엇입니까?

+0

배열에는 만들려는 하나의 객체에 대한 정보 만 있습니까? 나를 위해 – 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];
관련 문제