【问题标题】:Static method List<T> properties not found未找到静态方法 List<T> 属性
【发布时间】:2019-10-06 07:13:05
【问题描述】:

我正在清理如此讨厌的代码生成 他们在 UI (ASPX) 中有所有下拉菜单的类, 我首先能够更改为 linq 而不是我想要一个静态方法来传递列表

因此逻辑已从 UI 中卸载 这就是我所拥有的

我将传递的所有列表都具有以下这些属性, 刚刚使用

编写通用方法
public static string Get_GenericDisplayData_Data(IList<T> ilist)
        {
            var list = (from prop in ilist
                select new

                    Display = prop.Display ?? "",
                    Description = prop.Description ?? "",
                    Id = prop.Id
                }).ToList();

            string json = new JavaScriptSerializer().Serialize(list);
            return json;
        }

编译器抛出错误,显示、ID 和描述不存在或找不到, 如何解决?

【问题讨论】:

  • 你的问题是什么?
  • 编辑了 cmets
  • 你可以通过输入where T:{YouClassWithTheseFields}来修复它
  • 我不知道,这个项目中有将近 100 个具有这些属性的类
  • 为什么不编译?好吧,让我们举一个简单的例子。假设您使用List&lt;int&gt; 调用了此方法。 int 是否有 Display 属性? (当然,不,它没有)。 这就是它无法编译的原因是否知道对它的每次调用都将具有这些属性并不重要。 编译器不知道这一点。实际上,我建议您阅读 stackoverflow.com/questions/48748604/…docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…

标签: c# list generics types


【解决方案1】:

正如评论中已经提到的,您需要添加一个泛型类型约束来告诉编译器您的类型 T 完全符合检索这些成员的条件。

你可能有大量的类,这应该是你使用泛型的原因,但至少它们必须有一个定义了 Display、Description 和 Id 成员的基类,然后将其用作约束基类会让它编译,除非你的所有类都有这些成员,因此你的代码在逻辑上是不正确的。

where T : TheBaseClass

不太推荐的替代方法是使用动态。

from dynamic item in items
select new
{
    Display = item.Display ?? "",
    Description = item.Description ?? "",
    Id = item.Id
}

如果集合的元素类型没有这些成员,则会抛出运行时异常。

虽然运行时绑定可能会导致性能下降。

顺便说一句,您的标识符命名是反模式,名称不代表变量的逻辑含义。将 items 和 item 分别用于集合及其元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2014-02-18
    • 2013-03-28
    相关资源
    最近更新 更多