Nói cách khác có thể tạo assembly, mà thậm chí không biên dịch (giả sử mã kiểm tra không được gỡ bỏ) nếu mỗi các lớp không có thuộc tính tùy chỉnh ("phải có") (ví dụ: Tác giả và Phiên bản)?Có thể truy vấn thuộc tính tùy chỉnh trong C# trong thời gian biên dịch (không phải thời gian chạy)
Đây là mã tôi đã sử dụng để truy vấn trong thời gian chạy:
using System;
using System.Reflection;
using System.Collections.Generic;
namespace ForceMetaAttributes
{
[System.AttributeUsage (System.AttributeTargets.Method, AllowMultiple = true)]
class TodoAttribute : System.Attribute
{
public TodoAttribute (string message)
{
Message = message;
}
public readonly string Message;
}
[System.AttributeUsage (System.AttributeTargets.Class |
System.AttributeTargets.Struct, AllowMultiple = true)]
public class AttributeClass : System.Attribute
{
public string Description { get; set; }
public string MusHaveVersion { get; set; }
public AttributeClass (string description, string mustHaveVersion)
{
Description = description;
MusHaveVersion = mustHaveVersion ;
}
} //eof class
[AttributeClass("AuthorName" , "1.0.0")]
class ClassToDescribe
{
[Todo (" A todo message ")]
static void Method()
{ }
} //eof class
//how to get this one to fail on compile
class AnotherClassToDescribe
{
} //eof class
class QueryApp
{
public static void Main()
{
Type type = typeof(ClassToDescribe);
AttributeClass objAttributeClass;
//Querying Class Attributes
foreach (Attribute attr in type.GetCustomAttributes(true))
{
objAttributeClass = attr as AttributeClass;
if (null != objAttributeClass)
{
Console.WriteLine("Description of AnyClass:\n{0}",
objAttributeClass.Description);
}
}
//Querying Class-Method Attributes
foreach(MethodInfo method in type.GetMethods())
{
foreach (Attribute attr in method.GetCustomAttributes(true))
{
objAttributeClass = attr as AttributeClass;
if (null != objAttributeClass)
{
Console.WriteLine("Description of {0}:\n{1}",
method.Name,
objAttributeClass.Description);
}
}
}
//Querying Class-Field (only public) Attributes
foreach(FieldInfo field in type.GetFields())
{
foreach (Attribute attr in field.GetCustomAttributes(true))
{
objAttributeClass= attr as AttributeClass;
if (null != objAttributeClass)
{
Console.WriteLine("Description of {0}:\n{1}",
field.Name,objAttributeClass.Description);
}
}
}
Console.WriteLine ("hit Enter to exit ");
Console.ReadLine();
} //eof Main
} //eof class
} //eof namespace
//uncomment to check whether it works with external namespace
//namespace TestNamespace {
// class Class1 { }
// class Class2 { }
//}
Chỉnh sửa: Chỉ cần để biện minh cho sự lựa chọn của tôi cho câu trả lời. Tôi nghĩ casperOne đã cung cấp câu trả lời đúng cho câu hỏi.
Tuy nhiên, lý do đặt câu hỏi dường như là weak. Có lẽ tôi nên bắt đầu sử dụng một số công cụ bên ngoài như: FinalBuilder hoặc tạo kiểm tra đơn vị kiểm tra cho "yêu cầu" này, sử dụng Pex, Nunit hoặc các khuôn khổ kiểm tra đơn vị khác ...
EDIT Tôi đã thêm một nhỏ code snippet của chương trình điều khiển ở cuối câu trả lời thực hiện kiểm tra ... cảm thấy tự do để bình luận, phê bình hoặc đề xuất cải tiến
Một lần nữa tôi nhận ra rằng "yêu cầu" này cần được thực hiện như một phần của thử nghiệm đơn vị ngay trước "check in"
Thaks cho trả lời! Bạn có ý nghĩa cụ thể hơn bằng cách "Những gì bạn đang cố gắng làm không phải là một thay thế tốt cho một kiểm tra thời gian chạy thích hợp."? –
@YordanGeorgiev: Ngay cả khi bạn có quy trình xây dựng để đảm bảo thuộc tính được áp dụng, bạn nên STILL kiểm tra trong mã thời gian chạy của bạn để đảm bảo rằng thuộc tính được áp dụng. Bạn không thể ngừng kiểm tra ở đó bởi vì bạn nghĩ rằng bạn bắt gặp nó lúc biên dịch. – casperOne
Vì vậy, yêu cầu nhận được ít nhất 4 "phải có" thuộc tính sẽ ảnh hưởng đến hiệu suất, vì phản ánh ... Dường như việc thực hiện kiểm tra trong bài kiểm tra Đơn vị sẽ là ý tưởng tốt hơn?! –