Tôi ghét có một loạt các phương pháp "trái/phải". Mỗi khi một thuộc tính được thêm vào hoặc bị xóa, tôi phải sửa từng phương thức. Và bản thân mã chỉ trông ... sai.Làm thế nào để sử dụng sự phản chiếu để đơn giản hóa các nhà thầu và so sánh?
public Foo(Foo other)
{
this.Bar = other.Bar;
this.Baz = other.Baz;
this.Lur = other.Lur;
this.Qux = other.Qux;
this.Xyzzy= other.Xyzzy;
}
Thực sự đây chỉ là một vòng lặp chưa được kiểm soát lặp qua các thuộc tính, sao chép chúng giữa các đối tượng. Vậy tại sao không thành thật về thực tế đó? Phản ánh để giải cứu!
public Foo(IFoo other)
{
foreach (var property in typeof(IFoo).GetProperties())
{
property.SetValue(this, property.GetValue(other, null), null);
}
}
Tôi có thể đang cố ép mô hình tôi học được từ Lua lên C#, nhưng ví dụ cụ thể này dường như không quá có mùi với tôi. Từ đây, tôi bắt đầu làm một số thứ phức tạp hơn, nhạy cảm với thứ tự của các trường. Ví dụ, thay vì phải một chồng hầu như giống hệt if
báo cáo để soạn một chuỗi từ các lĩnh vực, tôi chỉ lặp qua chúng theo thứ tự mong muốn:
public override string ToString()
{
var toJoin = new List<string>();
foreach (var property in tostringFields)
{
object value = property.GetValue(this, null);
if (value != null)
toJoin.Add(value.ToString());
}
return string.Join(" ", toJoin.ToArray());
}
private static readonly PropertyInfo[] tostringFields =
{
typeof(IFoo).GetProperty("Bar"),
typeof(IFoo).GetProperty("Baz"),
typeof(IFoo).GetProperty("Lur"),
typeof(IFoo).GetProperty("Qux"),
typeof(IFoo).GetProperty("Xyzzy"),
};
Vì vậy, bây giờ tôi có iterability tôi muốn, nhưng tôi vẫn có ngăn xếp mã phản chiếu từng thuộc tính mà tôi quan tâm (Tôi cũng làm việc này cho CompareTo, sử dụng một tập hợp thuộc tính khác theo thứ tự khác). Tồi tệ hơn đó là việc đánh máy mạnh. Điều này thực sự bắt đầu có mùi.
Vậy còn việc sử dụng các thuộc tính trên mỗi thuộc tính để xác định thứ tự thì sao? Tôi bắt đầu xuống con đường này và thực sự nó hoạt động tốt, nhưng nó chỉ làm cho toàn bộ điều trông cồng kềnh. Nó hoạt động rất tốt về mặt ngữ nghĩa, nhưng tôi luôn cảnh giác với việc sử dụng các tính năng nâng cao chỉ vì chúng "gọn gàng". Sử dụng sự phản chiếu theo cách này có quá mức cần thiết không? Có một số giải pháp khác cho vấn đề mã trái/phải tôi đang thiếu?
i'dd thêm một thẻ ngôn ngữ để có được nhiều người xem – Toad
Hãy ghi nhớ, phản xạ luôn luôn đi kèm với hiệu suất một hit trong C#. Bạn sẽ thao tác Foos thường xuyên như thế nào? Một giải pháp lai có thể là sử dụng Reflection.Emit, và cache mã kết quả - khởi động chậm hơn, thực hiện nhanh. – zildjohn01
C# 4.0 đang được xây dựng trong trình biên dịch, có thể hữu ích trong việc tạo mã và sử dụng nó, bây giờ chúng tôi cũng có vấn đề tương tự nhưng chúng tôi đã thiết kế giải pháp bằng cách sử dụng cấu trúc lớp XML và chúng tôi sử dụng phương pháp tạo mã của riêng mình tạo ra rất nhiều phương thức khác phụ thuộc vào tên của memebers, về cơ bản nó là một ORML nhưng làm mọi thứ tự động. –