- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
是否可以将属性参数从派生类传递到其基类?
本质上,我正在尝试从派生类设置属性的属性参数。
如何用 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/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!