2016-04-28 5 views
4

Я пытаюсь создать экземпляр AnonymousType выглядит следующим образом:Создать новый экземпляр AnonymousType

new { Channel = g.Key.Channel, Comment = g.Key.Comment, Count = g.Count() } 

В темноте, .NET создает AnonymousType с конструктором, который принимает три аргумента: String, String, Int32.

Для того, чтобы создать новый экземпляр этого анонимного типа, Т, я:

object[] args = new object[3]; 
args[0] = "arg1"; 
args[1] = "arg2"; 
args[2] = 200; 
(T)Activator.CreateInstance(typeof(T), args); 

.NET отвалов меня:

Дополнительная информация: Конструктор не найден в '<> f__AnonymousType2 `3 [[System.String, ...], [System.String, ...], [System.Int32, ...]] '.

Я не знаю, почему CreateInstance пытается вызвать конструктор, например [[], [], []]!

Область

Реальный охват немного больше сложно объяснить:

Я создал поставщика Linq. Этот провайдер переводит предложения Linq на мои методы сервера. Когда я получаю json-информацию, мне нужно проецировать эту информацию в зависимости от того, какой пользователь Type задал. В этом случае:

var enumerable = UIContainer.UIController.Instance.getDigitalInputs() 
    .GroupBy(di => new { Channel = di.Channel, Comment = di.Comment }) 
    .Select(g => new { Channel = g.Key.Channel, Comment = g.Key.Comment, Count = g.Count() }); 

Итак, мне нужно проецировать каждый элемент JSon к new { Channel = g.Key.Channel, Comment = g.Key.Comment, Count = g.Count() }). В конце мне нужно создать экземпляр этого анонимного типа.

Итак:

// make the HTTP request 
IRestResponse response = (IRestResponse) this.client.CallApi(path, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, authSettings); 

if (((int)response.StatusCode) >= 400) { 
    throw new ApiException (response.StatusCode, "Error calling Search: " + response.Content, response.Content); 
} 

Newtonsoft.Json.Linq.JArray feeds = Newtonsoft.Json.Linq.JArray.Parse(response.Content); 
if (feeds.Any()) 
{ 
    PropertyDescriptorCollection dynamicProperties = TypeDescriptor.GetProperties(feeds.First()); 
    foreach (dynamic feed in feeds) 
    { 
     object[] args = new object[dynamicProperties.Count]; 
     int i = 0; 
     foreach (PropertyDescriptor prop in dynamicProperties) 
     { 
      args[i++] = prop.GetValue(feed); 
     } 
     //args[0] = ""; 
     //args[1] = ""; 
     //args[2] = 2; 

     yield return (T)Activator.CreateInstance(typeof(T), args); 
    } 
} 
+0

Что такое 'T' ...? –

+0

Почему вы пытаетесь это сделать? Если вам нужно создавать экземпляры по своему желанию, просто используйте именованный тип – Luaan

+0

Какой бы «анонимный тип». – Jordi

ответ

1

Не знаю, где вы получите T, но код работает отлично, если вы используете анонимный тип из предыдущих переменных:

var x = new { Channel = "Channel", Comment = "Comment", Count = 1 }; 

object[] args = new object[3]; 
args[0] = "arg1"; 
args[1] = "arg2"; 
args[2] = 200; 
var y = Activator.CreateInstance(x.GetType(), args); 

(И, чтобы ответить на Luaan : .NET использует конструктор для анонимных типов, см. IL :)

.method public hidebysig specialname rtspecialname 
     instance void .ctor(!'<Channel>j__TPar' Channel, 
          !'<Comment>j__TPar' Comment, 
          !'<Count>j__TPar' Count) cil managed 
+0

Да. Я только что понял, что он работает с использованием простого 'object [" a "," b ", 200]'. Проблема может исходить от объекта 'dynamic', созданного библиотекой Newton.Json. Я добавил тег 'json.net' в сообщение. – Jordi

+0

Понятия не имею, что такое 'T'. –

+0

'T' какой-либо AnonymousType – Jordi

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