Дженерики не сработают для вас, поскольку они всего лишь магия компилятора. Вы можете посмотреть 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 2010-11-24 15:54:54