int, string, bool과 같이 다양한 종류의 데이터가 포함 된 객체 배열이 있습니다. 개체에서 개별 레코드를 가져와야합니다..NET의 사용자 정의 객체
클래스에 저장해야합니다.
제네릭을 사용해야하는 이유는 무엇입니까?
int, string, bool과 같이 다양한 종류의 데이터가 포함 된 객체 배열이 있습니다. 개체에서 개별 레코드를 가져와야합니다..NET의 사용자 정의 객체
클래스에 저장해야합니다.
제네릭을 사용해야하는 이유는 무엇입니까?
필요한 속성으로 클래스 (예 : MyRecord
)를 만든 다음 List<MyRecord>
일반 인스턴스로 클래스 인스턴스를 유지해야합니다.
제네릭은 컴파일러 마술이므로 작동하지 않습니다. 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)
};
}
}
입니다, 당신은 간단하게이 작업을 수행 할 수 있습니다 :
배열에는 만들려는 하나의 객체에 대한 정보 만 있습니까? 나를 위해 – Seva
, 개인적으로, 질문을 이해할 수 있도록, 당신은 더 구체적이어야합니다. – akonsu