假设我有一个带有一些属性的接口:
public interface IDummy
{
string First {get;set;}
string Second {get;set;}
string Third {get;set;}
string Fourth {get;set;}
}
现在,我有一个实现该接口的类:
public class DummyClass: IDummy
{
// ...
}
是否可以,不是显式实现接口属性而是使用DynamicObject?例如:
public class DummyClass: DynamicObject, IDummy
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
// Get the value from a Config file or SQLite db or something
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
// Get the value to a Config file or SQLite db or something
}
}
我只是好奇这是否可能? 感谢。
答案 0 :(得分:4)
不,这是不可能的。
如果要实现接口,则需要实现其所有成员。毕竟,C#仍然是一种静态类型的语言。
当你说一个类型实现一个接口时,你说它符合它的合同。未实施所有成员意味着您不遵守合同。
编译器会看到你的代码并且不会假设你已经正确地实现了合同(以动态方式) - 它将无法编译。
答案 1 :(得分:1)
不,基本上。接口用于静态类型;为了满足接口,您的类型必须实际提供常规(非动态)实现。您可以不声称实现它(IDummy),并检测名称,但这可能与使用相同名称的任何接口有关,而不仅仅是IDummy。
答案 2 :(得分:1)
你可以做一个包装。
class DummyWrapper : IDummy
{
private readonly DynamicObject _wrapped;
public DummyWrapper(DynamicObject wrapped)
{
_wrapped = wrapped;
}
string First
{
get { return _wrapped.First; }
set { _wrapped.First = value; }
}
string Second
{
get { return _wrapped.Second; }
set { _wrapped.Second = value; }
}
string Third
{
get { return _wrapped.Third; }
set { _wrapped.Third = value; }
}
string Fourth
{
get { return _wrapped.Fourth; }
set { _wrapped.Fourth = value; }
}
}
您可能也对这些问题感兴趣: