以下の簡単なデモは、私がやろうとしていることを示しています。実際のプログラムでは、LINQ to SQL select式のリストを読み取っているため、オブジェクト初期化ブロックを使用する必要があります。データベースから読み取ってオブジェクトに格納したい値がありますが、オブジェクトその値に設定できる単純なプロパティがありません。代わりに、XMLデータストアがあります。
オブジェクトの初期化ブロックで拡張メソッドを呼び出すことができず、拡張メソッドを使用してプロパティをアタッチできないようです。
それで、私はこのアプローチで運が悪いのでしょうか?唯一の選択肢は、基本クラスの所有者にこのシナリオ用に変更するように説得することのようです。
BaseDataObjectをサブクラス化する既存のソリューションがありますが、これにも問題があり、この単純な例には表示されません。オブジェクトは、BaseDataObjectとして永続化および復元されます。キャストとテストは複雑になります。
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) };
}
}
(mattlantからの)回答の1つは、流暢なインターフェーススタイルの拡張メソッドを使用することを提案しています。例えば:
// 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);
しかし、これはLINQクエリで機能しますか?