2009-10-05 44 views
31

Tôi muốn làm điều này, nhưng nhận được lỗi này:Sử dụng các phương pháp mở rộng trong .NET 2.0?

Error 1 Cannot define a new extension method because the compiler required type 'System.Runtime.CompilerServices.ExtensionAttribute' cannot be found. Are you missing a reference to System.Core.dll? [snipped some path stuff]

Tôi đã thấy một số câu trả lời ở đây nói rằng, bạn phải xác định mình thuộc tính này.

Tôi làm như thế nào?

EDIT: Đây là những gì tôi có:

[AttributeUsage (AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] 
public sealed class ExtensionAttribute : Attribute 
{ 
    public static int MeasureDisplayStringWidth (this Graphics graphics, string text) 
    { 

    } 
} 
+1

Không; bạn cần * hai * lớp; một cho thuộc tính; một cho (các) phương pháp mở rộng; sẽ nâng cấp. –

Trả lời

58

Giống như vậy:

// you need this once (only), and it must be in this namespace 
namespace System.Runtime.CompilerServices 
{ 
    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class 
     | AttributeTargets.Method)] 
    public sealed class ExtensionAttribute : Attribute {} 
} 
// you can have as many of these as you like, in any namespaces 
public static class MyExtensionMethods { 
    public static int MeasureDisplayStringWidth (
      this Graphics graphics, string text) 
    { 
      /* ... */ 
    } 
} 

Ngoài ra; chỉ cần thêm một tham chiếu đến LINQBridge.

+0

Cảm ơn Marc, đó thực sự là bài đăng của bạn mà tôi đã đọc. Tôi chỉ cố gắng nhưng có được điều này: Lỗi Phương thức mở rộng phải được định nghĩa trong một lớp tĩnh không chung, nơi tôi có một phương thức như sau: public static int MeasureDisplayStringWidth (đồ họa Đồ họa này, ...) –

+0

Ngoài ra ExtensionAttribute can là bất kỳ tên nào, phải không? Và tại sao lại kế thừa từ Thuộc tính? –

+3

Bạn cần phải kế thừa từ thuộc tính cho nó là một thuộc tính ... và nó cần phải được gọi là ExtensionAttribute để trình biên dịch có thể tìm thấy nó. (Đó là những gì nó mong đợi nó được gọi.) Lỗi của bạn có lẽ là nó không nằm trong một lớp tĩnh. –

Các vấn đề liên quan