2014-03-06 115 views
-1

好吧,我刚刚发现扩展方法,扩展方法允许扩展方法和功能,以现有的类型,而无需更改代码:Here扩展对象的一类

// Extending using Extension methods 
static class MyExtensionMethods 
{ 
    public static int Negate(this int value) 
    { 
     return -value; 
    } 
} 

static void Main(string[] args) 
{ 
    //Using extension method 
    int i2 = 53; 
    Console.WriteLine(i.Negate()); 
} 

我的问题:

是否有可能与对象做同样的事情,例如添加int Id到Form,所以我可以这样做:

Form frm = new Form(); 

frm.Id = 2; 
+1

你的意思是ExtensionProperty?原因属性Id未在From上定义。如果不是这样, – Jehof

+0

请不要包含关于问题标题中使用的语言的信息,除非在没有它的情况下没有意义。标签用于此目的。 –

+0

@OndrejJanacek:标记已移除。 thx –

回答

1

是的,你可以在你想要的任何类型的类上创建扩展方法。

但是,您的示例不是方法,而是属性,您无法创建扩展属性。

以下是有效的:

static class FormExtensions{ 

    public static void SetId(this Form form, int someId) 
    { 
     // Do something with someId here 
    } 
} 

// Call it like this: 
Form frm = new Form(); 
frm.SetId(2); 
+0

所以没有实际的方法来扩展一个合适的类,因为我想添加到窗体的合适的id,所以每当我需要知道谁使用该窗体,我只是:frm.id!? –

+0

不,没有。但是,您可以使用“Form.Tag”属性,它只是您可以使用的对象。也就是说,如果你使用Windows Forms,而不是ASP.NET – Kenneth

+0

好的非常感谢你。看看它给出了什么,在标签中挖掘更多。 –

1

Form只是C#中的另一个对象...字符串可能是不可变的,但它只是另一个对象,所以没有理由不能为Form创建扩展方法。

但是,您不能在您的示例中添加属性设置器和获取器。 Eric Lippert谈到了this on his blog

1

扩展方法没有扩展属性。该方法看起来像是对象的一部分,但实际上它是与对象一起操作的静态方法。你的第一个例子被编译器转换为:

MyExtensionMethods.Negate(i)