C#为ICollection或IEnumerable中的特定项目创建getter委托

时间:2019-02-27 14:56:37

标签: c# delegates simulation ienumerable

我正在尝试创建一个动态Environment类,该类托管模拟的实时数据。我希望能够注册特定的“环境变量”,例如集合,字段等。使用此方法,使用类的用户将能够查看可用的变量并分别进行请求。

我希望基于反射,以便将来的任何开发人员都可以采用现有的类并将其合并到ICollection中,而无需实现其他功能。如果可能,我想添加对IEnumerable和/或Dictionary接口的支持,因此可以使用实现这些接口的现有类。例如,能够注册public class Environment { private delegate object GetterDelegate(); private Dictionary<string, GetterDelegate> environmentVariables_; public IEnumerable<string> EnvironmentVariables { get => environmentVariables_.Keys; } public object this[string name] { get => environmentVariables_[name](); } public Environment() { environmentVariables_ = new Dictionary<string, GetterDelegate>(); } public void Register( string name, ICollection collection ) { int i = 0; foreach( var element in collection ) environmentVariables_.Add( $"name_{i++}", GetterDelegate ); } public void Register( string name, IEnumerable enumerable ) { int i = 0; foreach( var element in enumerable ) environmentVariables_.Add( $"name_{i++}", GetterDelegate ); } public void Register<T,V>( string name, Dictionary<T,V> dictionary ) { // TODO: Custom logic instead of Key.ToString() foreach( var pair in dictionary ) environmentVariables_.Add( $"name_{pair.Key.ToString()}", GetterDelegate ); } public void Register( string name, FieldInfo field ) { environmentVariables_.Add( name, GetterDelegate ); } } 意味着环境将列出所有键值对作为环境变量,其中键被转换为唯一字符串,并且该值是在需要时提供的值。

如何实现的示例:

IEnumerable.ElementAt()

要做到这一点,我希望能够动态编译可直接访问特定元素的getter方法,而不必每次都调用ICollection,因为根据类的实现,这可能会非常慢。并且由于IEnumerable实现了BigInteger,因此在大多数情况下,可能以相同的方式进行处理。

是否可以编译一个可以直接获取特定IEnumerable元素而无需调用ElementAt()的DynamicMethod,它可能会在整个集合中枚举,直到找到正确的元素为止。如果环岛过弯,也欢迎采用更好的方法来解决此问题。

1 个答案:

答案 0 :(得分:1)

如果您需要能够按索引访问项目,请不要使用IEnumerableICollection。这些接口都不支持。

IList是代表可由索引访问的数据的接口。