在我的项目中,我正在创建许多类使用的通用接口。这包括必须始终存在的一些属性。
某些类是通用的,因此该属性必须在运行时更改。一些类将是高度专业化的,因此,属性的值将被硬编码。我希望能够在用户界面中使用Bindings来显示,并在可能的情况下编辑值。另外,我可以想象,在某些时候,我想使用反射来确定是否可以正确设置。
实现这一目标的最佳方法是什么?
1)在接口中将属性定义为读写,但在专用类中有一个空的setter。这似乎是一种常见的做法,但我担心绑定和反思会如何起作用。 UI控件仍然可以编辑,只是用户的更改不会,对吗?
2)在接口中将属性定义为只读,但在泛型类中提供setter。我希望绑定使用界面的UI仍然会将该属性视为只读,并且不允许编辑。
3)在接口中将属性定义为只读,但提供一些其他函数来更改泛型类中的值。这显然打破了属性范式,并且绑定不会知道它允许编辑。
是否有其他方法可以启用或禁用可被绑定和反射识别的setter?
答案 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();
}
}