实现扩展方法的最佳方法

时间:2010-11-21 10:25:55

标签: linq extension-methods asp.net-4.0

我真的非常真正新的所有这一切,其中大部分是未开发的领域。今天我需要创建一个匿名类并将其放入列表中。我试图找到如何列出匿名类型,并发现我应该创建一个扩展方法。我也已经想出一个扩展方法应该在一个静态类中。但我还没想到的是,是否有一些我应该使用的模式?现在,我在我的App_Code文件夹中创建了一个名为ExtensionMethods的静态类,但不知道我是否应该在这个类中添加各种类型的扩展方法,或者我是否应该创建单独的类等。

5 个答案:

答案 0 :(得分:1)

据我所知,您无法为匿名类实现扩展方法。如果类具有一些语义,它应该成为命名类,这是真的有道理。 要创建匿名类列表,请使用以下方法:

public static List<T> CreateListFromType<T>(T anonType){
   return new List<T>();
}

要使用此方法创建列表,请执行以下操作:

var list = CreateListFromType(new {A = default(int), B = default(int)});

答案 1 :(得分:0)

这是您创建匿名类列表的方法。

var anonList = new[]{
    new {Foo = "foo", Bar = 2},
    new { Foo = "bar", Bar = 3},
}.ToList();

它与编写扩展方法无关。

修改
事实上,您将很难使用扩展方法来创建匿名类型,因为匿名类型不能用作方法参数或返回类型。

<强> EDIT2:
如果要将匿名类型列表转换为特定类型列表,可以使用选择:

class MyClass
{
    public string Prop1 {get;set;}
    public int Prop2 {get;set;}
}

List<MyClass> myList = anonList.Select(x => new MyClass(){Prop1 = Foo, Prop2 = Bar}).ToList();

答案 2 :(得分:0)

扩展方法只不过是更易于阅读的静态帮助程序/实用程序方法。组织它们的方式与组织普通类的方式相同。如果你认为那些应该保持在一起,那么试着给它们一个有意义的,足够通用的名称作为类名。一旦你发现你的类名不能包括那个方法在做什么,那你就知道该方法应该属于其他地方。

答案 3 :(得分:0)

首先,扩展方法是像这样声明的普通静态方法 -

void MyExtension(this MyTarget target, int myparam){ ..

在此之后,C#编译器会添加一些语法糖,让您将此方法称为

target.MyExtension(myparam);

编译器将用

替换所有这些调用
MyStaticClass.MyExtension(target, myparam);

重要的是扩展方法是一种常规的静态方法。您在创建它们时应遵循以下准则 -

  1. 尝试在单独的静态类中为每个目标类分组扩展方法,并将其命名为Extensions。

  2. 在应用程序中为MyAppExtensions等扩展方法创建一个新的命名空间,并将静态类保存在此命名空间中。这将使编码人员不会将它们误解为扩展方法并意外地将它们用作实例方法。

  3. 将扩展方法的名称空间和静态类的这些命名约定作为团队中的标准。

  4. 在扩展方法中,检查第一个参数是否为null并采取适当的操作。如果不这样做,则可以调用target为null的方法,并可能导致意外行为。如果允许第一个参数为null,则将其清楚地记录下来。

  5. 有意识地决定创建和扩展方法是否正确,或者实例方法会更好。

  6. 请注意,扩展方法名称不会与此类的实例方法名称或其他现有扩展方法名称冲突。第1点,第2点和第3点将帮助您实现这一目标。

  7. 我从Jon Skeet's C# In Depth学到了这些。你也应该读它。

答案 4 :(得分:0)

我用来匿名给DataTable。由于它的限制,DataTable提供了更多功能,如序列化。