小编Ale*_*rck的帖子

新关键字:为什么不调用派生方法?

我有三个简单的课程:

class A
{
    public virtual void Write()
    {
        Console.Write("A");
    }
}

class B:A
{
    public override void Write()
    {
        Console.Write("B");
    }
}

class C : B
{
    public new void Write()
    {
        Console.Write("C");
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在创建对象并调用他们的方法:

A a = new A();
a.Write();

A b = new C();
b.Write();

C c = new C();
c.Write();
Run Code Online (Sandbox Code Playgroud)

输出将是: ABC

我无法理解的是这些代码产生的原因B:

A b = new C();
b.Write();
Run Code Online (Sandbox Code Playgroud)

我认为它应该是C.但是,我测试了很多次,而且它总是如此B.

我理解A b = new C()创建C的新对象类型.所以输出应该是C.或者在我们使用它而不进行转换时调用重写方法是特殊行为? …

c# inheritance

9
推荐指数
1
解决办法
1083
查看次数

EF和TPT:在SET子句中多次指定列名

我正在使用EF 6并使用TPT策略来模拟我的问题. Rule是一个抽象类.OvertimeRule是一个具体的类,继承自Rule.

Rule 看起来像这样:

public abstract class Rule
{   
    public int Id { get; set; }
    public PeriodType PeriodType { get; set; }
    public int SortOrder { get; set; }
    public int StatuteId { get; set; }
    public bool IsActive { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

OvertimeRule 看起来像这样:

public partial class OvertimeRule : Rule
{
    public decimal? ThresholdCoefficient { get; set; }
    public decimal? LimitCoefficient { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我创建一个新的OvertimeRule并尝试保存它时,EF首先生成此查询:

INSERT [dbo].[Rules]([PeriodType], …
Run Code Online (Sandbox Code Playgroud)

c# sql-server inheritance entity-framework

6
推荐指数
1
解决办法
4011
查看次数

为什么在单独的类中实现IEqualityComparer <T>

当我IEqualityComparermsdn上查找通用接口时,我注意到接口是在一个单独的"comparer"类IEquatable<T>中实现的,与类本身相反.当我搜索更多的例子时,每一个都使用一个单独的类,这让我想知道:为什么不在类本身上实现它?

我能想象压倒一切object.Equals,并object.GetHashCode因为它在很多不同的情况下使用不被认为是很好的做法,但即使MSDN说(重点煤矿):

此接口允许实现集合的自定义相等性比较.

因此它的用途几乎仅限于Linq.我可以想到为什么定义一个单独的比较器类只有两个原因:

  1. 对类集合的不同方法需要不同的比较器.
  2. 这个类很大,并且实例化它的另一个对象是不可取的(尽管如果这真的是问题,为什么没有整个集合它不坏?).

所以我的问题是:

有没有什么特别的原因让我忽略了导致每个人都只是为了比较来定义另一个comparerclass而不仅仅是在类本身上实现接口(在我看来,至少可以说这不会更糟)?

一个小例子:

public static void Main(string[] args)
{
    Test t1 = new Test { id = 1, date = default(DateTime) };
    Test t2 = new Test { id = 1, date = default(DateTime) };
    Test t3 = new Test { id = 0, date = default(DateTime) };
    List<Test> testList = new List<Test>{ t1, t2, t3 };

    //Same result
    int distinctCountClass …
Run Code Online (Sandbox Code Playgroud)

c# linq compare

5
推荐指数
1
解决办法
1705
查看次数

是否可以组合不同类型的代理(使用返回值作为参数)?

我有一个集合,我首先需要过滤,然后从中选择一个,但是如何处理集合取决于一些参数.所以我和两位代表一起去了,但不知怎的,我应该把它们结合起来:

delegate IEnumerable<T> FilterDelegate(IEnumerable<T> collection);
delegate T SelectorDelegate(IEnumerable<T> collection, ref T previous);

//Combine above two to this one:
delegate T GetItemDelegate(IEnumerable<T> collection, ref T previous);
Run Code Online (Sandbox Code Playgroud)

我试过这样的东西,但它失败了,因为委托不是匹配的类型:

static GetItemDelegate CreateDelegate(FilterDelegate filter, SelectorDelegate select)
{
    return Delegate.Combine(filter, select) as GetItemDelegate;
}
Run Code Online (Sandbox Code Playgroud)

题:

是否可以创建一个新的委托来调用第一个委托并使用返回值作为第二个的输入参数?没有ref参数我得到它与lambdas一起工作,但当然我不能使用out或者ref然后.

可编辑的例子:

namespace DelegateTest
{
   interface INumericValue
   {
       int Number { get; }
   }
   class Test : INumericValue
   {
       public Test(int i)
       {
           Number = i;
       }
       public int Number { get; }
   } …
Run Code Online (Sandbox Code Playgroud)

c# generics delegates

5
推荐指数
1
解决办法
300
查看次数

如何使用Open XML SDK将文本插入到内容控件中

我正在尝试开发一个解决方案,该解决方案从ASP.Net Web页面获取输入并将输入值嵌入到MS Word文档中的相应内容控件中.MS Word文档还具有静态数据,其中一些动态数据将嵌入到页眉和页脚字段中.

这里的想法是解决方案应该基于Web.我可以将OpenXML用于此目的或您可以建议的任何其他方法.

非常感谢您提供的所有宝贵意见.我真的很感激他们.

c# asp.net openxml openxml-sdk

4
推荐指数
1
解决办法
5304
查看次数

Object.defineProperty 带有构造函数和原型

我刚刚发现Object.defineProperty并且因为我对 C# 最熟悉,所以我想在构造函数中使用访问器属性,例如:

function Base(id) {
   var _id = id;

   Object.defineProperty(this,"ID",{
       get: function() { return _id; },
       set: function(value) { _id = value; }
   })
}

function Derived(id, name) {
   var _name = name;

   Base.call(this,id);

   Object.defineProperty(this,"Name",{
      get: function() { return _name; },
      set: function(value) { _name = value; }
   })
}

Derived.prototype = Object.create(Base.prototype);
Derived.constructor = Derived;

var b = new Base(2);
var d = new Derived(4,"Alexander");

console.log(b.ID);
console.log(d.ID, d.Name);
d.ID = 100;
console.log(d.ID, d.Name);
Run Code Online (Sandbox Code Playgroud)

这打印:

2
4 …

javascript properties

3
推荐指数
1
解决办法
4033
查看次数

PLSQL"错误游标已经打开"

我有以下代码:

DECLARE 
  f_cd fee.fee_cd%type;
  f_name fee.fee_nm%type; 
  f_new_cd fee.new_fee_cd%type;
  f_new_name fee.new_fee_nm%type;

  Cursor cur is
    SELECT Fee_cd, fee_nm, new_fee_cd, new_fee_nm FROM Fee;
BEGIN
  if cur%ISOPEN then
    close cur;
  end if;

  open cur;

  for rec in cur loop
    fetch cur INTO f_cd, f_name, f_new_cd, f_new_name;
    dbms_output.put_line ('The Fee Code ' || f_cd
                          || ' is the one you selected and it''s name is '
                          || f_name);
  end loop;

  close cur;
END;
Run Code Online (Sandbox Code Playgroud)

但我一直收到错误信息

原因: 尝试打开已打开的游标.

操作: 在重新打开之前先关闭光标.

我不知道发生了什么.当我改变代码以取消它for loop并使用loop... end loop …

oracle plsql for-loop cursor

1
推荐指数
1
解决办法
4520
查看次数

通用对象中的调用方法

有什么方法可以使用吗?

class A
{
    public virtual string Greet() { return "Hello"; }
}
class B : A
{
    public override string Greet() { return "Hola"; }
}
class C : A
{
    public override string Greet() { return "??????"; }
}
class Greeting<T>
{
    List<T> list;
    public Greeting(List<T> list)
    {
        this.list = new List<T>();
        this.list.AddRange(list);
    }
    public void Show()
    {
        foreach (T el in list)
            el.Greet(); // 'T' does not contain a definition for 'Greet'
    }
}
class Program
{ …
Run Code Online (Sandbox Code Playgroud)

c# generics

1
推荐指数
1
解决办法
100
查看次数