接口的动态实现
本文关键字:实现 动态 接口 | 更新日期: 2023-09-27 18:17:25
假设我有一个带有一些属性的接口:
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
}
}
我只是好奇这是否可能?谢谢。
不,这是不可能的
如果你要实现一个接口,你需要实现它的所有成员。毕竟c#仍然是一种静态类型语言。
当你说一个类型实现了一个接口,你是在说它遵循了它的契约。没有实现所有成员意味着您没有遵守合同。
编译器会看到你的代码,并且不会假设你已经正确地实现了合约(以一种动态的方式)——它会编译失败。
基本上没有。接口是用于静态类型的;为了满足接口,您的类型必须实际提供常规(非动态)实现。您可以不声明实现它 (IDummy),并检测名称,但这可能与使用相同名称的任何接口相关,而不仅仅是IDummy。
你可以做一个包装器
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; }
}
}
你可能对这些问题也感兴趣:
- 自动创建包装器来实现接口 在。net 4.0 (c#)中动态实现一个接口