【问题标题】:Extending a property and in meanwhile insert a new item扩展一个属性,同时插入一个新项目
【发布时间】:2013-02-21 09:58:03
【问题描述】:

这是我的代码:

var myList = myPage.News.Cast<MyNew>();

MyNew 有 20 个属性(名称、标题、日期、地点等),但缺少一个属性(例如)Tel

无法重新创建我的整个结构(它也来自 DLL),所以我想在该列表中更快地添加一个名为 Tel 的 MyNew 属性。所以在插入列表时扩展类。

【问题讨论】:

  • 您可以将它作为扩展方法添加到Tel()MyNew 吗?遗憾的是没有扩展属性。
  • MyNew 类是否被密封,就好像它不是你可以从添加任何你需要的属性的类中继承的一样
  • 您是否希望该属性在编译时可用,以便您可以在 C# 代码中引用它,或者它只参与运行时的内容?

标签: c# .net linq properties extend


【解决方案1】:
public class MyNewExtended: MyNew {
   public String Tel { get;set; }
}

var myList = myPage.News.Cast<MyNewExtended>();

(但请参阅下面 Chris Sinclair 的评论)

【讨论】:

  • 假设NewsIEnumerable&lt;MyNew&gt;Cast&lt;MyNewExtended&gt; 将失败,因为它们实际上不是子类类型的对象。
  • 我不知道 Cast() 如此棘手(“Cast() 的行为在 .NET 3.5 和 .NET 3.5 SP1 之间发生了变化”)——stackoverflow.com/questions/445471/…
  • 把它想象成一个子类的字面类型转换。即使存在显式/隐式转换,它也不会执行任何转换。 (但由于 MyNewExtended 扩展了 MyNew 你无论如何都无法编写用户定义的转换)
【解决方案2】:

您应该能够使用这样的部分类扩展MyNew

public partial class MyNew
{
    public int Tel { get; set; }
}

Tel 将像任何其他属性一样可用。

【讨论】:

  • 无法使用partial,因为该类已在另一个 DLL 中编译。
  • Partial 只是一种跨文件拆分类的方法。该类首先必须是部分的。
  • -1 Vaze 重新阅读了 OP 如何在他的问题中解释他的问题。 partial class won't help
  • 对不起。你说得对。我没有看到它来自另一个 DLL。
【解决方案3】:

不,但您可以创建一个匿名类型,其中包括原始类型和您的新列:

var myList = myPage.News
                   .Cast<MyNew>()
                   .Select( new { m => MyNew = m,
                                       Tel = [formula for tel]
                                }
                          );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-13
    • 2017-01-12
    • 2021-03-09
    • 2013-07-23
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    相关资源
    最近更新 更多