gpt4 book ai didi

c# - 是否可以将属性参数从派生类传递到其基类?

转载 作者:太空宇宙 更新时间:2023-11-03 16:17:21 25 4
gpt4 key购买 nike

是否可以将属性参数从派生类传递到其基类?

本质上,我正在尝试从派生类设置属性的属性参数。

  • 如何用 C++ 实现

    public class HasHistory<T, string name> {
    public HasHistory() {
    History=new History<T>();
    }

    // here's my attribute
    [BsonElement(name)]
    public History<T> History {
    get;
    protected set;
    }
    }

    但是,非类型模板参数在 C++ 中是合法的,但在 C# 中是非法的

  • C# 中的意外解决方法

    我意识到我可以使该属性成为虚拟属性,并在派生类中添加该属性。但是我会在构造函数中调用一个虚函数,虽然这可能有效,但这是不好的做法。

    我确实想进行该调用,因为我希望基类构造函数初始化该成员;这实际上是基类的全部要点。

    public class HasHistory<T> {
    public HasHistory() {
    // this will be called before Derived is constructed
    // and so the vtbl will point to the property method
    // defined in this class.
    // We could probably get away with this, but it smells.
    History=new History<T>();
    }

    // here's my property, without an Attribute
    public virtual History<T> History {
    protected set;
    get;
    }
    }

    public class Derived: HasHistory<SomeType> {
    // crap! I made this virtual and repeated the declaration
    // just so I could add an attribute!
    [BsonElement("SomeTypeHistory")]
    public virtual HasHistory<SomeType> History {
    protected set;
    get;
    }
    }

    所以我想我不能将属性放在基类中,而是将它放在派生类属性上,该派生类属性使用/根据 protected 基类属性实现,但这太麻烦了,以至于它避免了通过使用基类。

所以有一个很好的方法,对吧?正确的?

如何在派生类的属性上重新定义属性,该属性继承自派生类中的基而不覆盖属性

最佳答案

更新:该死,你已经考虑过了。我应该在发布之前更新 :)

不幸的是,您想要做的完全超出了 C# 的属性机制的范围。泛型与模板不同,因此这种变通方法已经差不多了。

大多数情况下,您无论如何都会在顶层定义一个属性,所以通常这不是问题。当它 是一个问题时 - 显然在您的情况下 - 然后您必须使用丑陋的解决方法。

下面是原始答案...


如果我对这个例子的理解是正确的,那么您想要根据在派生类型中/由派生类型声明的某些值将属性应用于类成员。由于 C# 不支持泛型的非类型参数,因此您需要另一种方法来执行此操作。

您可以做的一件事是像这样覆盖后代类中的属性:

public class HasHistory<T>
{
public HasHistory()
{
History = new History<T>();
}

public virtual History<T> History { get; protected set; }
}

public class MyHistory<T> : HasHistory<T>
{
public MyHistory()
: base()
{}

[BSONElement("some name")]
public override History<T> History
{
get
{
return base.History;
}
protected set
{
base.History = value;
}
}
}

使用 BsonElement 的代码属性将与派生的 actual 类型一起使用 HasHistory<T>实例,因此它将查看 virtual 末尾定义的属性链。鉴于上面的代码,如果我创建一个 MyHistory<T>实例并将其传递给 BSON 序列化程序,它将找到附加到 History 的属性MyHistory<T>内的属性(property)类。

然而,您可以在基层定义一个属性,并在必要时在派生类中覆盖它。不确定这对您的情况是否有用。

这是更多的工作,特别是因为您必须在每个派生类中执行此操作,但我认为这与您在本例中将要获得的 C++ 模板样式一样接近。不过,我很高兴被证明是错误的:)

关于c# - 是否可以将属性参数从派生类传递到其基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15423191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com