2009-01-28 27 views
8

Một số ứng dụng thú vị cho các thuộc tính tùy chỉnh trong mã CLR/C# mà bạn đã thực hiện hoặc nghe nói là gì? Ngoài ra sử dụng mới thú vị của các thuộc tính tiêu chuẩn cũng ok!Sử dụng mát mẻ thuộc tính hoặc chú thích (CLR hoặc Java)?

Chỉnh sửa: Vì chú thích của Java có vẻ giống như attrbutes của CLR, việc sử dụng chú thích Java cũng hợp lệ.

Trả lời

12
  • postsharp, sử dụng thuộc tính cho mã tiêm (AOP)?
  • [TypeDescriptionProvider] mà có thể được sử dụng để cung cấp một mô hình bất động sản thời gian chạy tùy chỉnh - một trong hai đặc tính hoàn toàn khác nhau, hoặc có lẽ faster ones

Và một số những người cốt lõi mà thường bị bỏ qua:

  • [TypeForwardedTo] - được sử dụng để di chuyển các loại giữa các cụm không tái xây dựng
  • [PrincipalPermission] - được sử dụng để tự động thực thi bảo mật trên các thành viên
+0

Darn, bạn đánh bại tôi với nó! –

+0

+1 cho PrincipalPermissionAttribute - Tôi không thể tin rằng tôi đã làm điều này bằng tay trước đây. – Botz3000

8

Trong khi không hoàn toàn C#, tôi đã tìm thấy một cách sử dụng thú vị các chú thích Java (= C# thuộc tính) để đánh dấu các bài tập của học sinh. Mỗi học kỳ tôi lập trình một robot đánh dấu cho sinh viên, và nó chỉ ra rằng năm đầu tiên sinh viên vì một lý do dường như không thể làm theo hướng dẫn chính xác, mà tất nhiên gây ra các robot đánh dấu thất bại. Vì vậy, những gì tôi làm là đi qua mã của họ, tìm tất cả các phương pháp không đáp ứng các đặc điểm kỹ thuật và sửa chữa chúng. Sau đó, tôi đặt chú thích (= thuộc tính) vào từng phương pháp sai, yêu cầu robot đánh dấu đánh dấu chúng xuống. Đó có lẽ là cách đơn giản và trực tiếp nhất để làm điều này tôi nghĩ.

+0

Việc sửa mã bằng tay của từng học sinh có vẻ đơn giản không? –

+0

Đúng, nhưng trong trường hợp của chúng tôi, nó đơn giản vì chúng tôi có một chính sách nếu công việc của học sinh không biên dịch, nó không được đánh dấu. Vì vậy, tất cả những gì tôi đã làm là loại bỏ phương pháp và thay thế nó bằng cuống. –

1

Tôi có một trường hợp, nơi tôi muốn trình bày việc triển khai thực tế của giao diện dưới dạng dữ liệu. Điều này có thể được thực hiện thông qua Reflection tất nhiên, nhưng bằng cách sử dụng một thuộc tính cụ thể trên các thành viên tôi muốn phơi bày dưới dạng dữ liệu, tôi có thể đóng gói công việc cần thiết để làm điều này. Kết quả cuối cùng là tôi tạo triển khai, trang trí các thành viên mong muốn và sau đó tôi có thể truy vấn các thành viên thông qua cả mã và dữ liệu mà không cần phải thực hiện mã Phản chiếu trong mỗi trường hợp.

1

Đôi khi, tôi sử dụng các thuộc tính để trang trí các lớp hoặc phương pháp và sử dụng sự phản chiếu để có được dữ liệu 'được phân bổ'.

Có thể hơi khó giải thích, nhưng điều cuối cùng mà tôi đã sử dụng thuộc tính, nằm trong một hệ thống mà tôi có một vài thực thể trong cơ sở dữ liệu.

Mỗi thực thể có một số loại 'mã', và mỗi thực thể cũng có thể có một số quy tắc thông dịch.

Trong dự án của tôi, tôi có một lớp thực thể, đại diện cho một thực thể tồn tại trong Cơ sở dữ liệu, và tôi cũng có một bộ các lớp 'Quy tắc'. Một lớp Quy tắc chứa logic giải thích của một thực thể cụ thể.

Để 'liên kết' một 'Quy tắc' nhất định (diễn giải) với một trường hợp cụ thể của pháp nhân của tôi, tôi đã tạo Thuộc tính tùy chỉnh.

Tôi trang trí lớp 'Quy tắc' của mình với thuộc tính này và thông qua thuộc tính, tôi xác định đối tượng nào là Quy tắc. Sau đó, khi tôi tải một thực thể từ DB, tôi tiêm đúng quy tắc vào thực thể đó.

Một chút code để làm cho mọi việc rõ ràng:

public class MyEntity 
{ 
    public string Code 
    { 
     get; 
     private set; 
    } 

    public bool IsValidFor(...) 
    { 
     IRule rule = RuleRegistry.GetRuleFor(this); 

     if(rule.IsValid()) ... 
    } 

} 

[RuleAttrib("100")] 
public class MyRule : IRule 
{ 
    public bool IsValid() 
    { 
    } 
} 

Đây chỉ là một ví dụ nhỏ, nhưng tôi nghĩ rằng bạn sẽ bắt trôi dạt.

Thuộc tính RuleAttrib trên lớp MyRule, nói rằng đây là Quy tắc nên được áp dụng cho phiên bản MyClass có mã "100".

Ví dụ RuleRegistry có thể truy xuất IRule chính xác cho thực thể hiện tại (sử dụng phản chiếu).

Một ví dụ khác ở nơi mà tôi đã thuộc tính được sử dụng, kết hợp với PostSharp, là việc thực hiện một hệ thống 'khóa': http://fgheysels.blogspot.com/2008/08/locking-system-with-aspect-oriented.html

+0

Ý tưởng thú vị có –

1

chúng tôi sử dụng các chú thích tùy chỉnh java để đánh dấu các mục đích đặc biệt của phương pháp nhất định, chủ yếu nhắm mục tiêu tại các nhà phát triển:

  • @ScriptingAPI - dấu mã được tiếp xúc như là một phần của API kịch bản của chúng tôi (cảnh báo các nhà phát triển rằng những thay đổi có thể ảnh hưởng đến các API công cộng)
  • @Transaction - đánh dấu phương pháp trên t mặt tiền cơ sở dữ liệu đang bắt đầu/cam kết giao dịch (chúng tôi có lớp xử lý giao dịch chuyên dụng tôn trọng chú thích này)
  • @NeedsAttentionToSupportFoo - nếu chúng tôi biết tính năng Foo là yêu cầu chúng tôi cần giải quyết trong tương lai gần, chúng tôi sử dụng chú thích để đánh dấu mã mà chúng tôi sẽ cần chạm để hỗ trợ, tức là khi chúng tôi bắt gặp một đoạn mã khiến chúng tôi nghĩ "ah, điều này sẽ cần phải được thay đổi để hỗ trợ Foo", chúng tôi chú thích nó. nếu việc triển khai Foo bị trì hoãn hoặc sẽ không bao giờ xảy ra, việc xóa chú thích dễ dàng hơn là hoàn nguyên các tối ưu hóa trước khi trưởng thành nằm rải rác xung quanh trong mã.

một ví dụ khác về cách sử dụng chú thích tùy chỉnh được đề cập trong this java specialist newsletter: thi hành công thức xây dựng không có công khai trong tất cả các lớp con.

3

Kiểm tra xUnit và xem cách các thuộc tính được sử dụng để đánh dấu kiểm tra đơn vị cho hành vi mong đợi cũng như dữ liệu nguồn cấp dữ liệu vào thử nghiệm. Các thuộc tính được sử dụng một cách có ý nghĩa hơn so với MSTest hoặc NUnit.

Từ Samples\TestMethodExtensibility\Example.cs:

public class Example 
{ 
    static int val; 

    [RepeatTest(5, Timeout=250)] 
    public void RepeatingTestMethod() 
    { 
     Thread.Sleep(100); 
     Assert.Equal(2, 2); 

     if (val == 0) 
     { 
      val++; 
      Thread.Sleep(1000); 
     } 
    } 
} 

Từ test.xunit.extensions\DataTheories\TheoryAttributeTests.cs:

internal class TestMethodCommandClass 
{ 
    public static IEnumerable<object[]> EmptyData 
    { 
     get { return new object[0][]; } 
    } 

    public static IEnumerable<object[]> NullData 
    { 
     get { return null; } 
    } 

    public static IEnumerable<object[]> TheoryDataProperty 
    { 
     get { yield return new object[] { 2 }; } 
    } 

    [Theory, PropertyData("EmptyData")] 
    public void EmptyDataTheory() { } 

    [Theory, PropertyData("NullData")] 
    public void NullDataTheory() { } 

    [Theory, OleDbData(
     @"Provider=Microsoft.Jet.OleDb.4.0; Data Source=DataTheories\UnitTestData.xls; Extended Properties=Excel 8.0", 
     "SELECT x, y, z FROM Data")] 
    public void TestViaOleDb(double x, 
          string y, 
          string z) { } 

    [Theory, PropertyData("TheoryDataProperty")] 
    public void TestViaProperty(int x) { } 

    [Theory, ExcelData(@"DataTheories\UnitTestData.xls", "SELECT x, y, z FROM Data")] 
    public void TestViaXls(double x, 
          string y, 
          string z) { } 

} 

Để biết chi tiết xem:

http://www.codeplex.com/xunit

+0

Ah vâng, đây là những gì tôi coi là một trong những cách sử dụng chú thích thích hợp nhất. –

2

nunit tất nhiên

các tập quán thuộc tính đã được kent beck:

NUnit 2.0 là một ví dụ tuyệt vời về thiết kế thành ngữ. Hầu hết những người cảng xUnit chỉ dịch phiên bản Smalltalk hoặc Java. Đó là những gì chúng tôi đã làm với NUnit lúc đầu, quá. Phiên bản mới này là NUnit vì nó đã được thực hiện đã được thực hiện trong C# để bắt đầu.

nguồn: http://www.nunit.org/

1

Castle của ActiveRecord sử dụng các thuộc tính. Nó ẩn một số phức tạp thiết lập của NHibernate bằng cách trang trí các đối tượng Mô hình của bạn với các thuộc tính chỉ ra các lớp và các trường cần được duy trì cho cơ sở dữ liệu (và cách thức). Ngoài ra còn có sử dụng các thuộc tính trong thành phần xác nhận hợp lệ để thêm xác thực dựa trên mô hình vào ActiveRecord và ngăn xếp Monorail.

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