C# 在继承类中为父级属性添加自定义属性
-
23-09-2019 - |
题
我在通用 DataGrid 中显示业务对象,并且我想通过自定义属性设置列标题,例如:
class TestBo
{
[Header("NoDisp")]
public int ID {get; set;}
[Header("Object's name")]
public String Name { get; set; }
}
到目前为止,一切都很好,但我还想通过继承将显示与数据分开:
class TestBO
{
public int ID {get; set;}
public String Name { get; set; }
}
class TestPresentationBO : TestBO
{
//Question: how to simply set the Header attribute on the different properties?
}
我看到了通过在 Child 构造函数中使用 SetCustomAttribute 进行反射的解决方案,但这会很麻烦,那么对于这个问题有一个简单而优雅的技巧吗?
请阻止我破坏数据/表示分离;o)
解决方案
只是想,你不能用部分类和 元数据类型属性?MVC2 使用此模式进行模型验证。
其他提示
问题:如何简单地设置标题属性对不同的性质
有没有办法设置一个继承的成员的一个属性已建议的方式,由于属性特定于一个类型。 SetCustomAttribute不会帮助你 - 当你构建新类型的在运行时,它只是什么好的。一旦一个属性已被编译,你不能在运行时改变它,因为它的一部分的元数据的。
如果你想保持分离,你将不得不另谋出路。
(你可以做的属性虚拟的,在演示类中重写它们,在覆盖添加属性,但是这看起来躲闪并没有真正独立的东西 - 你结束了在你的TestPresentationBO完整TestBO类反正.. 。)
请在TestBo
属性虚拟和TestPresentationBO
覆盖它们。这样,你可以添加属性。
您可以像WCF RIA服务。将属性添加到TestBO,像[演示]服用类型作为参数。这种新型将重新定义的属性,但与呈现的属性。 在运行时,你必须得到新的类型的身份,并得到其属性的自定义属性。
或者忘掉属性和具有字典映射与呈现BO类的薄。此演示BO类做同样的事情如上述,即具有自定义属性的属性重新定义
演示BO类从不实例化,它只是反映后得到呈现信息。
您是否使用 MVVM(模型视图视图模型)模式?在我看来,部分来自其他答案,您实际上无法像您想要的那样使用自定义属性来做到这一点。但是,在我看来,你的 TestPresentationBO
实际上就像一个“视图模型” TestBO
. 。视图模型基本上是业务或逻辑类的一种包装器或代理——这基本上就是您想要的。(这个视图模型的总结可能不是 100% 准确;我自己刚刚开始使用 MVVM。)
您可以创建一个 TestBOViewModel
包裹 TestBO
, ,然后传递集合 TestBOViewModel
到数据网格。当然,您可以使用以下方法修饰暴露包装类的属性 [Header("Object's name")]
ETC。这不使用继承,但我不明白为什么在这种情况下需要使用继承。但是,使用视图模型确实可以通过使用包装器(视图模型)将演示文稿(视图)与数据(模型)完全分离。
有关 MVVM 模式的更多信息,我发现这是一本有趣的读物: 具有模型-视图-视图模型设计模式的 WPF 应用程序.
像这样的东西。当然,您也可以在这里添加验证和其他好处。
public class TestBOViewModel // extend from DependencyObject
{ // if you want to use dependency properties
private TestBO _myBO;
public TestBOViewModel(TestBO bo)
{
_myBO = bo;
}
[Header("NoDisp")]
public int ID
{
get { return _myBO.ID; }
set { _myBO.ID = value; }
}
}
有关C#6.0,你可以轻松地隐藏继承的成员,并介绍自己的属性。这可能,但是,隐藏在原始属性的属性。另外这款简化的语法,使属性只读,所以你可能需要管get / set方法自己。
public class User
{
public string Login { get; set; }
}
public class UserDetail : User
{
[Display(Name = "Login:")]
public new string Login => base.Login;
}