当前位置:  开发笔记 > 编程语言 > 正文

索引器的扩展方法,它们会好吗?

如何解决《索引器的扩展方法,它们会好吗?》经验,为你挑选了1个好方法。

索引器的扩展方法,它们会好吗?

我正在玩一些重新补充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

我的代码中的一些片段

/////////////////////////////////////////////
// Client calling code
IDab dab = DabFactory.Create( "Northwind" );
string sql = @"select * from Customers ";
var persons = dab.ExecuteReader(sql);
if (dab != null{
   Assert.That(persons[0].CustomerID , Is.EqualTo("ALFKI"));}
/////////////////////////////////////////////
List IDab.ExecuteReader(string commandText) 
{
    List pocos = new List();
    // setup connection
    SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
    while (reader.Read())
    {
            Dictionary colMappings = null ;
            if (colMappings == null){
                colMappings = reader.GetSqlDataReaderColumnMappings();}
            T poco = new T();
            poco.DbToMem(reader, colMappings);
            pocos.Add(poco);
        }
    }
    // connection cleanup ...
    return pocos ;
}

// the set extension method signature
public static void Set(this T thisClientObject, string thisPropertyName, object newValue) where T : class

Marc Gravell.. 12

索引器与属性共享许多共性(在引擎盖下,索引器具有索引的属性),并且扩展属性不存在.同意,有些情况下它们很方便.

重新提出的情景 - 在某些方面,这很像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)



1> Marc Gravell..:

索引器与属性共享许多共性(在引擎盖下,索引器具有索引的属性),并且扩展属性不存在.同意,有些情况下它们很方便.

重新提出的情景 - 在某些方面,这很像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)

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有