2013-04-30 18 views
8

Có cách nào để cung cấp tên cho hàm sau đó trả về giá trị của trường hoặc thuộc tính trên đối tượng đã cho với tên đó không? Tôi đã cố gắng để làm việc xung quanh nó với các nhà điều hành null-coalesce, nhưng dường như không thích các loại khác nhau (mà cũng là một chút lạ với tôi vì null là null). Tôi có thể tách nó ra thành nếu null, nhưng phải có một cách tốt hơn để làm điều này. Đây là chức năng của tôi, và hai dòng với các đối tượng Comparison không biên dịch, nhưng tôi sẽ để chúng ở đó để hiển thị những gì tôi đang cố gắng làm.C# Phản ánh lấy trường hoặc thuộc tính theo tên

private void SortByMemberName<T>(List<T> list, string memberName, bool ascending) 
{ 
    Type type = typeof (T); 
    MemberInfo info = type.GetField(memberName) ?? type.GetProperty(memberName); 

    if (info == null) 
    { 
     throw new Exception("Member name supplied is neither a field nor property of type " + type.FullName); 
    } 

    Comparison<T> asc = (t1, t2) => ((IComparable) info.GetValue(t1)).CompareTo(info.GetValue(t2)); 
    Comparison<T> desc = (t1, t2) => ((IComparable) info.GetValue(t2)).CompareTo(info.GetValue(t1)); 

    list.Sort(ascending ? asc : desc); 
} 

Tôi đã nghe nói về một thứ gọi là LINQ động có thể được sử dụng, nhưng vì lợi ích của việc học, tôi đang làm theo cách của tôi.

+2

Toán tử kết hợp không hợp lệ không hoạt động vì 'FieldInfo' không phải là' PropertyInfo'. Sử dụng 'as' để truyền chúng. – FlyingStreudel

Trả lời

12

Thay đổi dòng này:

MemberInfo info = type.GetField(memberName) ?? type.GetProperty(memberName); 

này:

MemberInfo info = type.GetField(memberName) as MemberInfo ?? 
    type.GetProperty(memberName) as MemberInfo; 

vì không có diễn viên tiềm ẩn với lớp cơ sở khi sử dụng các nhà điều hành ternary như thế. Các ternary yêu cầu các loại của tất cả các kết quả đầu ra là như nhau.

+4

Đó không phải là toán tử bậc ba, đó là toán tử kết hợp null. –

+1

Ngoài ra ... tên là toán tử * có điều kiện * –

+0

@MichaelPerrenoud Điều đó có thể đúng, nhưng chúng là các toán tử riêng biệt trong đặc tả ngôn ngữ. Toán tử phép trừ có thể là cú pháp đường cho một sự phủ định và một phép cộng, nhưng nếu vậy, bạn sẽ gọi nó là toán tử bổ sung? (Và spec này đề cập đến "ternary operator" như một tên thay thế cho toán tử điều kiện.) –