2016-12-21 5 views
1

У меня есть таблица данных в домашнем контроллере следующим образом:GenericArguments [0], «MvcApplication66.Controllers.HomeController + Инфо», на «System.Nullable`1 [Т]» нарушает ограничение параметра типа «Т»

public DataTable GetTable() 
    { 
     DataTable table = new DataTable(); 
     table.Columns.Add("Dosage", typeof(int)); 
     table.Columns.Add("Drug", typeof(string)); 
     table.Columns.Add("Patient", typeof(Info)); 
     table.Columns.Add("Date", typeof(DateTime)); 

     table.Rows.Add(25, "Indocin", new Info("India"), DateTime.Now); 
     table.Rows.Add(50, "Enebrel", new Info("UK"), DateTime.Now); 
     table.Rows.Add(10, "Hydralazine", new Info("Bhutan"), DateTime.Now); 
     table.Rows.Add(21, "Combivent", new Info("India"), DateTime.Now); 
     table.Rows.Add(100, "Dilantin", new Info("GreenLand"), DateTime.Now); 
     return table; 
    } 

Информационный класс следующим

public class Info 
    { 
     public string Address { get; set; } 
     public Info(string Add) { 
      this.Address = Add; 
     } 
    } 

Тогда я вызвать метод TableSerialization следующим

public ActionResult Index(){ 
     DataTable table = GetTable(); 
     ViewBag.dataSource = table; 
     DataTableOperations dp = new DataTableOperations(); 
     dp.DataTableSerialize(table.AsEnumerable(), li); 
     return View(); 
    } 

In Da taTable Serialize я определить следующим образом

 public static Dictionary<string, Type> DataTableSerialize(this IQueryable datasource) 
     { 
      var DataColumns = datasource.Take(1).Cast<DataRow>().CopyToDataTable().Columns.Cast<DataColumn>(); 
      var type = typeof(Nullable<>); 
      var cols = DataColumns.Select(column => new { column = column.ColumnName, ColumnType = column.DataType, IsNullable = column.AllowDBNull }).ToList(); 
      return cols.ToDictionary(d => d.column, d => d.IsNullable && (d.ColumnType != typeof(string)) ? type.MakeGenericType(new[] { d.ColumnType }) : d.ColumnType); 
     } 

я получил ошибку в

(d.ColumnType! = TypeOf (строка))? type.MakeGenericType (новый [] {d.ColumnType}): d.ColumnType);

Мой стек трассировки

[TypeLoadException: GenericArguments[0], 'MvcApplication66.Controllers.HomeController+Info', on 'System.Nullable`1[T]' violates the constraint of type parameter 'T'.] 
    System.RuntimeTypeHandle.Instantiate(RuntimeTypeHandle handle, IntPtr* pInst, Int32 numGenericArgs, ObjectHandleOnStack type) +0 
    System.RuntimeTypeHandle.Instantiate(Type[] inst) +94 
    System.RuntimeType.MakeGenericType(Type[] instantiation) +214 

[ArgumentException: GenericArguments[0], 'MvcApplication66.Controllers.HomeController+Info', on 'System.Nullable`1[T]' violates the constraint of type 'T'.] 
    System.RuntimeType.ValidateGenericArguments(MemberInfo definition, RuntimeType[] genericArguments, Exception e) +4366838 
    System.RuntimeType.MakeGenericType(Type[] instantiation) +230 

Где я совершить ошибку

ответ

1

Nullable generic type не может использоваться с классами или строками, поэтому MakeGenericType дает ошибки в случае сложного поля (i.e Info Class).

так я изменить условие, а именно:

d => (d.IsNullable && (d.ColumnType != typeof(string)) && (d.ColumnType.IsValueType)) ? type.MakeGenericType(new[] 
{ d.ColumnType }) : d.ColumnType); 
2

Тип аргумента Nullable<> ограничивается быть типа ненулевое значение. Вы не указали тип непустого значения. Либо не создавайте значение null, либо не передавайте ему ссылочный тип, когда вы это делаете.

+0

Не могли бы вы, пожалуйста, дайте мне знать, как сделать так – Kalai

+0

В моем блоке кода, я проверить, является ли значение обнуляемым или не d.IsNullable && (d.ColumnType! = typeof (string)) после этого только я использую type.MakeGenericType (new [] {d.ColumnType}) – Kalai