Bản trình diễn đơn giản dưới đây ghi lại những gì tôi đang cố gắng thực hiện. Trong chương trình thực, tôi phải sử dụng khối khởi tạo đối tượng vì nó đang đọc một danh sách trong một biểu thức chọn LINQ to SQl, và có một giá trị mà tôi muốn đọc ra khỏi cơ sở dữ liệu và lưu trữ trên đối tượng, nhưng đối tượng không có một thuộc tính đơn giản mà tôi có thể đặt cho giá trị đó. Thay vào đó nó có một kho dữ liệu XML.Có cách nào để sử dụng phương pháp mở rộng trong khối khởi tạo đối tượng trong C#
Có vẻ như tôi không thể gọi phương thức mở rộng trong khối trình khởi tạo đối tượng và tôi không thể đính kèm thuộc tính bằng phương thức tiện ích.
Vì vậy, tôi không may mắn với cách tiếp cận này? Cách thay thế duy nhất có vẻ là thuyết phục chủ sở hữu của lớp cơ sở sửa đổi nó cho kịch bản này.
Tôi có một giải pháp hiện có nơi tôi phân lớp BaseDataObject, nhưng điều này cũng có vấn đề không hiển thị trong ví dụ đơn giản này. Các đối tượng được duy trì và phục hồi như BaseDataObject - các phôi và các phép thử sẽ trở nên phức tạp.
public class BaseDataObject
{
// internal data store
private Dictionary<string, object> attachedData
= new Dictionary<string, object>();
public void SetData(string key, object value)
{
attachedData[key] = value;
}
public object GetData(string key)
{
return attachedData[key];
}
public int SomeValue { get; set; }
public int SomeOtherValue { get; set; }
}
public static class Extensions
{
public static void SetBarValue(this BaseDataObject dataObject,
int barValue)
{
/// Cannot attach a property to BaseDataObject?
dataObject.SetData("bar", barValue);
}
}
public class TestDemo
{
public void CreateTest()
{
// this works
BaseDataObject test1 = new BaseDataObject
{ SomeValue = 3, SomeOtherValue = 4 };
// this does not work - it does not compile
// cannot use extension method in the initialiser block
// cannot make an exension property
BaseDataObject test2 = new BaseDataObject
{ SomeValue = 3, SomeOtherValue = 4, SetBarValue(5) };
}
}
Một trong những câu trả lời (từ mattlant) gợi ý sử dụng phương pháp mở rộng kiểu giao diện thông thạo. ví dụ:
// fluent interface style
public static BaseDataObject SetBarValueWithReturn(
this BaseDataObject dataObject, int barValue)
{
dataObject.SetData("bar", barValue);
return dataObject;
}
// this works
BaseDataObject test3 = (new BaseDataObject
{ SomeValue = 3, SomeOtherValue = 4 }).SetBarValueWithReturn(5);
Nhưng điều này có hoạt động trong truy vấn LINQ không?
Mục đích là để trừu tượng phương thức Đặt ra khỏi BaseDataObject? Tôi đặc biệt khuyên bạn chỉ nên sử dụng phân lớp với Thuộc tính Get/Set .. – Tigraine