索引器的扩展方法,它们会好吗? [关闭]
Posted
技术标签:
【中文标题】索引器的扩展方法,它们会好吗? [关闭]【英文标题】:Extension Methods for Indexers, would they be good? [closed] 【发布时间】:2010-10-10 15:23:49 【问题描述】:索引器的扩展方法,它们好吗?
我正在玩一些代码来补充 POCO 的水分。
代码围绕从 SqlDataReader 返回的行进行迭代,并使用反射从列值中分配属性。在我的调用堆栈中,我有一个这样的代码:-
poco.Set("Surname", "Smith"); // uses extension method ...
Set 方法是作为扩展方法编写的。
能写出这样的代码真是太好了
poco["Surname"] = "Smith"; // extension methods for indexers ?
即我想为索引器写一个扩展方法
.Net 没有索引器的扩展方法有充分的理由吗? 其他人对扩展方法索引器有其他好的用途吗?
顺便说一句... 如果我们可以为索引器编写扩展方法,那么我们可以编写这样的代码……
var poco = PocoFactory();
poco.Surname = “Smith”; // is this javascript ...
poco[Surname] = “Smith” ; // … or is this c# or both
我的代码中的一些 sn-ps
/////////////////////////////////////////////
// Client calling code
IDab dab = DabFactory.Create( "Northwind" );
string sql = @"select * from Customers ";
var persons = dab.ExecuteReader<NorthwindCustomer>(sql);
if (dab != null
Assert.That(persons[0].CustomerID , Is.EqualTo("ALFKI"));
/////////////////////////////////////////////
List<T> IDab.ExecuteReader<T>(string commandText)
List<T> pocos = new List<T>();
// setup connection
SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
while (reader.Read())
Dictionary<string, int> colMappings = null ;
if (colMappings == null)
colMappings = reader.GetSqlDataReaderColumnMappings();
T poco = new T();
poco.DbToMem<T>(reader, colMappings);
pocos.Add(poco);
// connection cleanup ...
return pocos ;
// the set extension method signature
public static void Set<T>(this T thisClientObject, string thisPropertyName, object newValue) where T : class
【问题讨论】:
【参考方案1】:为了给 Pocos 补水,我建议看一下 AutoMapper Nuget 包。它使得非常简单,大大减少了代码量。
【讨论】:
【参考方案2】:索引器与属性有很多共同点(实际上,索引器是带有索引的属性),而扩展属性不存在。同意,在某些情况下它们很方便。
重新呈现的场景 - 在某些方面,这很像 dynamic
。当然,如果您声明了一个具有字符串索引器的接口,那么您的阅读器代码可以直接使用它——但实现它会很多不必要的工作重复界面!
重新扩展方法;这使用常规反射吗?你可能想看看像HyperDescriptor
这样的技巧,如果你经常这样做,它可能会节省大量的 CPU 时间。典型的用法是:
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
while (reader.Read())
T poco = new T();
// abbreviated...
(per prop)
props[propName].SetValue(poco, cellValue);
您可以通过首先查看返回的列(每个网格一次,而不是每行一次)来进一步优化这一点,并且只访问匹配的列...
或者,查看 ORM 工具; Expression
也可用于读取数据(我在 usenet 某处有一个完整的示例,用于 DbLinq)
【讨论】:
有趣的谢谢,我去看看。以上是关于索引器的扩展方法,它们会好吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章