C# 避免魔弦反射vs常量 基于以下两个例子,有什么更好的方法可以避免这种魔法?

C# 避免魔弦反射vs常量 基于以下两个例子,有什么更好的方法可以避免这种魔法?,c#,reflection,devexpress,magic-numbers,magic-string,C#,Reflection,Devexpress,Magic Numbers,Magic String,已知关系 我们知道这门课的意思 未知关系 我们不知道该类(因为多个类可能有一个同名的属性),甚至不知道该属性是否存在 我可以创建一个define类,它将所有属性都定义为const,这样我就可以避免属性的冗余,但是维护这个define也是一项工作 当我进行反射时,我只做MemberName.GetMemberName(x=>x.junival),任何更改都会自动应用,但当我遇到第二种情况时,我只是假设可能存在此属性。我不能使用show反射,因为即使代码仍然有效,propertyname也可能在


已知关系
我们知道这门课的意思

未知关系

我们不知道该类(因为多个类可能有一个同名的属性),甚至不知道该属性是否存在


我可以创建一个define类,它将所有属性都定义为const,这样我就可以避免属性的冗余,但是维护这个define也是一项工作


当我进行反射时,我只做
MemberName.GetMemberName(x=>x.junival)
,任何更改都会自动应用,但当我遇到第二种情况时,我只是假设可能存在此属性。我不能使用show反射,因为即使代码仍然有效,propertyname也可能在其他类中更改。另外,这也会增加一些开销


更新
这个问题与DevExpress密切相关,因为它们到处都使用“magicstring”,并且您不能更改基类

基类(和接口)的用途不是这样吗?除此之外,这是一种类似WPF属性的机制(但在IMO中实际上是过度杀戮)。还请注意,可能会使用
CallerMemberNameAttribute
nameof()
(根据您使用的C版本)。@AdrianoRepetti我使用的是devexpress,因此无法直接修改基类,与
FindItem
示例devexpress组件相同的事情是固定的,但您的模型类也是固定的?例如,联系。在第一个示例中,您可以使用呼叫者信息,在第二个示例中,您可以使用nameof(Customer.junival)。没有硬编码字符串(再次假设周年是整个模型共享的属性,IPerson.周年或类似的内容)。@AdrianoRepetti在第二个示例中不是“客户”,我甚至不知道他们在哪里对“联系人”隐藏对象,以及它是“联系人”还是“彩虹战士”:)因为没有“TargetObjectType”它可以是任何东西,鸡和蛋。如果你不喜欢神奇的字符串,那么你就不喜欢反射。这难道不是基类(和接口)的用途吗?除此之外,这是一种类似WPF属性的机制(但在IMO中实际上是过度杀戮)。还请注意,可能会使用
CallerMemberNameAttribute
nameof()
(根据您使用的C版本)。@AdrianoRepetti我使用的是devexpress,因此无法直接修改基类,与
FindItem
示例devexpress组件相同的事情是固定的,但您的模型类也是固定的?例如,联系。在第一个示例中,您可以使用呼叫者信息,在第二个示例中,您可以使用nameof(Customer.junival)。没有硬编码字符串(再次假设周年是整个模型共享的属性,IPerson.周年或类似的内容)。@AdrianoRepetti在第二个示例中不是“客户”,我甚至不知道他们在哪里对“联系人”隐藏对象,以及它是“联系人”还是“彩虹战士”:)因为没有“TargetObjectType”它可以是任何东西,鸡和蛋。如果你不喜欢魔术弦,那么你就不喜欢反射。
    public string Notes
    {
        get { return notes; }
        set { SetPropertyValue("Notes", ref notes, value); }
    }
public void SomeStuffeChanged()
{
    PropertyEditor propertyEditor = ((DetailView)View).FindItem("Anniversary") as PropertyEditor;
    // do some stuff
}