Sử dụng PropertyInfo để tìm ra loại thuộc tính


108

Tôi muốn phân tích cú pháp động một cây đối tượng để thực hiện một số xác thực tùy chỉnh. Việc xác thực không quan trọng như vậy, nhưng tôi muốn hiểu rõ hơn về lớp PropertyInfo.

Tôi sẽ làm một cái gì đó như thế này,

public bool ValidateData(object data)
{
    foreach (PropertyInfo propertyInfo in data.GetType().GetProperties())
    {
        if (the property is a string)
        {
            string value = propertyInfo.GetValue(data, null);

            if value is not OK
            {
                return false;
            }
        }
    }            

    return true;
}

Thực sự phần duy nhất tôi quan tâm vào lúc này là 'nếu thuộc tính là một chuỗi'. Làm cách nào tôi có thể tìm ra loại đối tượng PropertyInfo từ đối tượng đó.

Tôi sẽ phải xử lý những thứ cơ bản như string, ints, double. Nhưng tôi cũng sẽ phải xử lý các đối tượng, và nếu vậy tôi sẽ cần phải đi qua cây đối tượng sâu hơn bên trong các đối tượng đó để xác thực dữ liệu cơ bản bên trong chúng, chúng cũng sẽ có các chuỗi, v.v.

Cảm ơn.

Câu trả lời:


215

Sử dụng PropertyInfo.PropertyTypeđể lấy loại thuộc tính.

public bool ValidateData(object data)
{
    foreach (PropertyInfo propertyInfo in data.GetType().GetProperties())
    {
        if (propertyInfo.PropertyType == typeof(string))
        {
            string value = propertyInfo.GetValue(data, null);

            if value is not OK
            {
                return false;
            }
        }
    }            

    return true;
}

1
Tuyệt quá. Tôi sẽ thử cái này. Typeof (string) và typeof (String) có tương đương nhau không? Sẽ ở trên với cả một chuỗi và chuỗi?
peter

3
OK, đã viết một số bài kiểm tra đơn vị và nó hoạt động tốt. Nó thực sự xử lý chuỗi và chuỗi giống nhau. Tôi đã mong đợi điều đó, nhưng chỉ muốn chắc chắn.
peter

4
@peter Có, stringStringbằng nhau. stringlà một bí danh cho String.
Aage

Phương thức IsAssignableFrom: msdn.microsoft.com/en-us/library/… sẽ hoạt động trong nhiều trường hợp hơn (thay vì toán tử bằng nhau, ví dụ: generics)
martin

1
@bump Chỉ mới nhìn thấy nhận xét này từ vài năm trước nhưng tôi chỉ muốn thêm cho rõ ràng đó stringlà bí danh cho System.String. Nó có thể tạo ra sự khác biệt bởi vì để sử dụng Stringbạn phải thêm using System;dòng. 2 xu của tôi;)
Sébastien Sevrin

0

Tôi chỉ tình cờ thấy bài viết tuyệt vời này. Nếu bạn chỉ đang kiểm tra xem dữ liệu có thuộc loại chuỗi hay không thì có lẽ chúng ta có thể bỏ qua vòng lặp và sử dụng cấu trúc này (theo ý kiến ​​khiêm tốn của tôi)

public static bool IsStringType(object data)
    {
        return (data.GetType().GetProperties().Where(x => x.PropertyType == typeof(string)).FirstOrDefault() != null);
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.