根据我从SelectMany的文档中理解,可以使用它来生成1-many关系的(扁平化)序列.
我有以下课程
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
class Order
{
public int Id { get; set; }
public int CustomerId { get; set; }
public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用查询表达式语法来使用它们
var customers = new Customer[]
{
new Customer() { Id=1, Name ="A"},
new Customer() { Id=2, Name ="B"},
new Customer() { Id=3, Name ="C"}
};
var orders = new Order[]
{
new Order …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个允许我在ASP.NET/C#应用程序中使用OAuth的库,这样我就可以使用以下OAuth提供程序之一对用户进行身份验证
谷歌
雅虎
推特
我查看了各种开源库,发现存在一个或另一个问题(有些根本不起作用,有些针对一个服务而不是其他服务).我也看过OAuthDotNet,我必须承认,我发现它太复杂,无法弄清楚如何开始使用它,所以我没有真正尝试过.
所以基本上我正在寻找一个简单易用的库,它可以对抗上面提到的提供者(至少).
以下是一些讨论代码
abstract class ClassA
{
public abstract void StartProcess();
}
class ClassB : ClassA
{
public override void StartProcess()
{
Console.WriteLine("ClassB: Render");
}
}
class ClassC : ClassA
{
public override void StartProcess()
{
base.StartProcess();//This is where the compiler complains
Console.WriteLine("ClassC: Render");
}
}
Run Code Online (Sandbox Code Playgroud)
在每个人都跳下我的喉咙之前,让我说我完全清楚它为什么没有.但有些情况下,能够这样做是有意义的,并且可以防止必须将基类的方法声明为虚拟但具有空实现.
来自Delphi背景,我们可以在Delphi中完成这个并在我们的类设计中使用它.如果你错误地在基类上调用抽象方法(在运行时),你就会得到一个"抽象错误".
然后我希望(Delphi)编译器检查我之前!现在我希望(C#)编译器允许我这样做!这有多奇怪?
问题:编译器/ Jitter难道不能忽略这样的调用并发出警告而不是错误吗?别人看到/感受到这种痛苦吗?
我需要的情况如下:ClassA是库的一部分(无法控制此类)生成ClassC(类似于编译ASP.NET页面或编译Razor View的方式).
但是库的用户可以定义ClassB,然后ClassC将从ClassB而不是ClassA(当它生成时)下降.类似于ASP.NET页面通常从System.Web.UI.Page下载的方式,但是如果您已经定义了自己的"基础"页面和应用程序中的其他页面,那么现在从您的基页继承,那么生成的类将从您的基页下降(转而来自System.Web.UI.Page).
我希望这部分是清楚的.然后看看我提供的代码,我无法获得ClassC的实例来调用ClassB的实现,因为代码gen不知道包含base.StartProcess().
编辑 似乎有些人并不完全得到我写的东西.因此,假设您正在编写代码生成部分,该部分生成从ClassA下降的ClassC.好吧,因为该方法是anstract(在ClassA中),所以无法生成调用StartProcess()的代码行(因为编译器不允许它).因此,如果有人定义了ClassB,代码生成仍然不会调用base.StartProcess().这实际上是ASP.NET MVC视图中发生的事情.
理想情况下,我希望编译器忽略它.它忽略了很多东西,例如在null引用上调用dispose.
我正在尝试进行讨论,而不是鼓吹......
EDIT2 假设我们有一个层次结构,如上面的代码所示,它工作正常.我们现在的机会是,基类ClassA可能有一个实现(将来)StartProcess()后代将调用它.今天实现这一目标的唯一方法是将方法定义为无虚体.但这对我来说感觉有点蠢.