加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 创建一个新的AnonymousType实例

发布时间:2020-12-15 22:30:19 所属栏目:百科 来源:网络整理
导读:我正在尝试创建一个AnonymousType实例,如下所示: new { Channel = g.Key.Channel,Comment = g.Key.Comment,Count = g.Count() } 在黑暗中,.NET创建一个带有构造函数的AnonymousType,它带有三个参数:String,String,Int32. 为了创建这个匿名类型的新实例,我
我正在尝试创建一个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转发我:

Additional information: Constructor not found in ‘<>f__AnonymousType2`3[[System.String,…],[System.String,[System.Int32,…]]’.

我不知道为什么CreateInstance试图调用像[[],[],[]]这样的构造函数!

范围

真正的范围有点难以解释:

我创建了一个Linq提供者.此提供程序将Linq语句翻译为我的服务器方法.当我收到json信息时,我需要将此信息投影到用户指定的类型.在这种情况下:

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

所以,我需要将每个json项目投影到一个新的{Channel = g.Key.Channel,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);
    }
}

解决方法

不确定从哪里获得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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读