【问题标题】:Why can I not create this implicitly-typed array?为什么我不能创建这个隐式类型的数组?
【发布时间】:2015-07-15 13:00:19
【问题描述】:

这是我的代码:

AccountMenuList = new[] 
{
    new {transKey = "MY_TICKETS", stateName="account.tickets", displayUrl="/account/tickets/"},
    new {transKey = "TRANSACTION_HISTORY", stateName = "account.transactionhistory", displayUrl = "/account/transactions"},
    new {transKey = "PAYIN", stateName = "account.payin",displayUrl = "/account/payin"},
    new {transKey = "PAYOUT", stateName = "account.payout", displayUrl = "/account/payout"},
    new {transKey = "TICKET_PAYOUT", stateName = "account.ticketpayout", displayUrl = "/account/ticketpayout"},
    new {transKey = "SETTINGS",stateName="default",displayUrl="default",SubMenuList=new[]{new{transKey = "something"}}}
};

但我收到以下错误:

没有找到隐式类型数组的最佳类型

怎么了?我可以解决这个问题吗?

【问题讨论】:

  • 如何定义AccountMenuList
  • 您收到错误是因为最后一个匿名类型包含另一个属性SubMenuList
  • 您可以将此SubMenuList 添加到所有项目中
  • @None,然后在其他实例中将该属性设置为 null
  • 你到底在用这个做什么。如果 Andriy Horen 猜测它是为 Json 准备的,那么请使用他的答案。如果您需要在代码中的其他位置访问这些值,那么您需要一个自定义类或将该属性设置为其他匿名类中的某个值。

标签: c#


【解决方案1】:

怎么了?

对于每个匿名类型,编译器都会在后台创建一个实际类型,并且所有具有相同声明的对象都是一种类型,除了最后一种类型:

new {transKey = "SETTINGS",stateName="default",displayUrl="default",SubMenuList=new[] {new{transKey = "something"}}

如何解决?

  1. 为您的菜单项创建自定义类型更有意义,因为稍后您可能希望动态添加/删除/过滤它们。

  2. 通过在数组初始化中添加object,您可以显式创建对象数组(其中包含不同的匿名类型实例):

    var accountMenuList = new object[] 
    {
        new {transKey = "MY_TICKETS", stateName="account.tickets", displayUrl="/account/tickets/"},
        new {transKey = "TRANSACTION_HISTORY", stateName = "account.transactionhistory", displayUrl = "/account/transactions"},
        new {transKey = "PAYIN", stateName = "account.payin",displayUrl = "/account/payin"},
        new {transKey = "PAYOUT", stateName = "account.payout", displayUrl = "/account/payout"},
        new {transKey = "TICKET_PAYOUT", stateName = "account.ticketpayout", displayUrl = "/account/ticketpayout"},
        new {transKey = "SETTINGS",stateName="default",displayUrl="default",SubMenuList=new[]{new{transKey = "something"}}}
    };
    

【讨论】:

  • 当然现在你不能在没有反射或强制转换为动态的情况下使用数组中的值。
  • 好吧,只有当你想以 json 格式发送时它才会起作用
  • 是的,但我没有看到任何关于这个问题用于 Json 的信息。
  • 假设代码示例是一个网站的菜单项集合将被序列化为 json,但我可能错了
【解决方案2】:

从最后一个条目中删除SubMenuList=new[]{new{transKey = "something"}}。所有条目必须具有相同类型的数据才能使隐式类型数组起作用。

【讨论】:

  • OP 声明他们需要这个。将属性添加到其他条目而不是从最后一个条目中删除它更有意义。
  • @juharr 如何将 null 分配给 anonyumus 类型属性?
  • 在这种情况下,最好创建自己的类而不是隐式类型。
【解决方案3】:

就像其他人指出的那样。在这种情况下,您可能需要创建一个类。 这是一个例子。

public class mydata
{
    public string transKey { get; set; }
    public string stateName { get; set; }
    public string displayUrl{ get; set; }
}

然后我会使用类型列表。

List<mydata>  myDataList = new List<mydata>();

要添加到列表中,您可以这样做。

// create object
mydata md = new mydata();
md.transKey = "MY_TICKETS";
md.stateName = "account.tickets";
md.displayUrl = "/account/tickets/";
// add to your list
myDataList.add(md);

如果您想循环访问 myDataList,您可以执行以下操作。

foreach(var items in myDataList)
{
    response.write(items.transkey);
}    

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-07-23
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多