2010-04-23 3 views
5

Возможно ли во время выполнения создать класс из DataTable, где ColumnName будет свойствами динамического класса?Создание динамического класса в C#

+0

Почему? Что ты пытаешься сделать? – SLaks

+0

Вы имеете в виду определение нового класса или динамическое определение существующих свойств класса? – JustLoren

+0

Я хочу создать новый класс с именами столбцов dataTable – Polaris

ответ

1

Да (с использованием Reflection.Emit), но это плохая идея.
Что вы пытаетесь сделать?

+0

У меня есть RadGridView, у которого есть некоторые проблемы, когда я использую dataTable в качестве источника для него. Но когда я использую List , все работает нормально. Есть идеи? – Polaris

+1

Вы должны задать вопрос как отдельный вопрос. – SLaks

1

Читая ваши комментарии, я обнаружил, что вы имеете в виду. Просто используйте Generics: используя поля List для генерации объектов. Код довольно прост:

public class DynClass<T, P> 
    { 
     public DynClass() 
     { 
      _fields = new Dictionary<T, P>(); 
     } 

     private IDictionary<T, P> _fields; 

     public IDictionary<T, P> Fields 
     { 
      get { return _fields; } 
     } 

    } 

    public class TestGenericInstances 
    { 
     public TestGenericInstances() 
     { 
      Client cli = new Client("Ash", "99999999901"); 

      /* Here you can create any instances of the Class. 
      * Also DynClass<string, object> 
      * */ 
      DynClass<string, Client> gen = new DynClass<string, Client>(); 

      /* Add the fields 
      * */ 
      gen.Fields.Add("clientName", cli); 

      /* Add the objects to the List 
      * */ 
      List<object> lstDyn = new List<object>().Add(gen); 
     }   
    } 
+0

Каждый раз, когда у меня могут быть разные столбцы с разными именами и типами. Можете ли вы рассказать мне о своем варианте в деталях или показать мне мир кода? – Polaris

1

Если у вас есть C# 4 вы можете использовать новую динамику имеют и ExpandoObject. Вы можете read a tutorial about it here.

+2

Его действительно невероятно, что можно использовать с помощью этой технологии! – Erup

4

С # 4, вы можете сделать это

dynamic foo = new ExpandoObject(); 

// mimic grabbing a column name at runtime and adding it as a property 
((IDictionary<string, object>)foo).Add("Name", "Apple"); 

Console.WriteLine(foo.Name); // writes Apple to screen 

Не рекомендовать его или что-нибудь, но это показывает, что это возможно.

+0

отличный инструмент, но не в моем случае. Я использую framework 3.5 – Polaris

0

Я собираюсь посмотреть в ExpandoObject, о котором упоминалось (я проголосовал за это решение, как мне кажется, проще), но да, это возможно. Я строю класс в одном из моих проектов, где сторонняя утилита требует, чтобы строка CSV определялась как класс.

Вы можете создать код (я включил \ г \ п, так что я мог читать результирующий код):

 string code = "using FileHelpers;\r\n\r\n"; 

     code += "[DelimitedRecord(\"" + delimiter + "\")]\r\n"; 
     code += "public class CustomCSVInputFile "; 
     code += "{ \r\n"; 

     foreach (string column in columnList) 
     { 
      code += " public string " + column.Replace(" ", "") + ";\r\n"; 
     } 
     code += "}\r\n"; 

     CompilerResults compilerResults = CompileScript(code); 

...

public static CompilerResults CompileScript(string source) 
    { 
     CompilerParameters parms = new CompilerParameters(); 
     FileHelperEngine engine; 

     parms.GenerateExecutable = false; 
     parms.GenerateInMemory = true; 
     parms.IncludeDebugInformation = false; 

     string path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Replace("file:\\", "").Trim(); 

     parms.ReferencedAssemblies.Add(Path.Combine(path, "FileHelpers.dll")); 

     CodeDomProvider compiler = CSharpCodeProvider.CreateProvider("CSharp"); 

     return compiler.CompileAssemblyFromSource(parms, source); 
    } 

... Как я уже говорил , Если бы мне пришлось сделать это снова, я бы исследовал ExpandoObject, но, безусловно, возможно создать класс из DataTable. Вам нужно будет допросить имена столбцов для создания ваших полей; в моем примере был список имен столбцов, предоставленных из строки с разделителями «,».

Мой пример из очень конкретного варианта использования, но этого должно быть достаточно, чтобы вы могли работать, если ExpandoObject не работает для вас.

Смежные вопросы