如何将属性设置为只读或可在各种相关类中设置?

时间:2011-03-22 19:24:54

标签: c# properties

在我的项目中,我正在创建许多类使用的通用接口。这包括必须始终存在的一些属性。

某些类是通用的,因此该属性必须在运行时更改。一些类将是高度专业化的,因此,属性的值将被硬编码。我希望能够在用户界面中使用Bindings来显示,并在可能的情况下编辑值。另外,我可以想象,在某些时候,我想使用反射来确定是否可以正确设置。

实现这一目标的最佳方法是什么?

1)在接口中将属性定义为读写,但在专用类中有一个空的setter。这似乎是一种常见的做法,但我担心绑定和反思会如何起作用。 UI控件仍然可以编辑,只是用户的更改不会,对吗?

2)在接口中将属性定义为只读,但在泛型类中提供setter。我希望绑定使用界面的UI仍然会将该属性视为只读,并且不允许编辑。

3)在接口中将属性定义为只读,但提供一些其他函数来更改泛型类中的值。这显然打破了属性范式,并且绑定不会知道它允许编辑。

是否有其他方法可以启用或禁用可被绑定和反射识别的setter?

2 个答案:

答案 0 :(得分:2)

好的,这是我的2美分 - 你可能不喜欢我要说的。

如果你有一个只读的属性,其他时候读写,其余时间读写,你有一个漏洞抽象这里的多态性可能只会导致混淆你班级的客户。

所以要么我会有2个接口,其中只读取其他只读,只是放弃多态这些属性。

答案 1 :(得分:1)

你绝对应该只在界面中的属性上有一个getter。拥有一个并不总是实现的setter只会导致混乱。

然后,您可以在适当的类中实现setter。根据您的应用程序,您可能希望创建一个允许设置属性的扩展接口。

示例:

    public interface ITest
    {
        int Test { get; }
    }

    public interface ITestExtended : ITest
    {
        new int Test { get; set; }
    }

    public class Monkey : ITestExtended
    {
        public int Test { get; set; }

        // Be carefull to explicitly implement the original interface
        int ITest.Test
        {
            get
            {
                return 7;
            }
        }
    }

    public class MonkeySimple : ITest
    {
        public int Test
        {
            get { return 10; }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ITestExtended monkey = new Monkey() { Test = 5 };
            ITest monkeySimple = monkey;

            Console.WriteLine(monkeySimple.Test);
            Console.WriteLine(monkey.Test);

            // Compiler error
            //monkeySimple.Test = 6;

            Console.ReadKey();
        }
    }