コンテンツパイプライン拡張で工場と同様のパターンを使用する必要があります。私は、辞書の種類で始まる:XNAコンテンツパイプライン内からサービスにアクセスする
public partial class TestContent
{
// Test type
public string title;
// Once test if true
public bool once;
// Parameters
public Dictionary<string, object> args;
public TestContent()
{
title = string.Empty;
args = new Dictionary<string, object>();
}
public TestContent(XElement xe)
{
title = xe.Name.ToString();
args = new Dictionary<string, object>();
xe.ParseAttribute("once", once);
}
}
XElement.ParseAttributeは1想像のとおりに機能拡張メソッドです:
public delegate T Mapper<T>(MapFactory<T> mf, XElement d);
public class MapFactory<T>
{
Dictionary<string, Mapper<T>> map = new Dictionary<string, Mapper<T>>();
public void Add(string s, Mapper<T> m)
{
map.Add(s, m);
}
public T Get(XElement xe)
{
if (xe == null) throw new ArgumentNullException(
"Invalid document");
var key = xe.Name.ToString();
if (!map.ContainsKey(key)) throw new ArgumentException(
key + " is not a valid key.");
return map[key](this, xe);
}
public IEnumerable<T> GetAll(XElement xe)
{
if (xe == null) throw new ArgumentNullException(
"Invalid document");
foreach (var e in xe.Elements())
{
var val = e.Name.ToString();
if (map.ContainsKey(val))
yield return map[val](this, e);
}
}
}
は、ここで私は保存するオブジェクトの一種です。成功すれば真であるブール値を返します。
問題には、さまざまな種類のテストがあり、それぞれが特定のテストに固有の方法でオブジェクトに値を設定します。要素名は、MapFactoryの辞書のキーです。このタイプのテストは、非定型ですが、私の問題を示しています。
public class LogicTest : TestBase
{
string opkey;
List<TestBase> items;
public override bool Test(BehaviorArgs args)
{
if (items == null) return false;
if (items.Count == 0) return false;
bool result = items[0].Test(args);
for (int i = 1; i < items.Count; i++)
{
bool other = items[i].Test(args);
switch (opkey)
{
case "And":
result &= other;
if (!result) return false;
break;
case "Or":
result |= other;
if (result) return true;
break;
case "Xor":
result ^= other;
break;
case "Nand":
result = !(result & other);
break;
case "Nor":
result = !(result | other);
break;
default:
result = false;
break;
}
}
return result;
}
public static TestContent Build(MapFactory<TestContent> mf, XElement xe)
{
var result = new TestContent(xe);
string key = "Or";
xe.GetAttribute("op", key);
result.args.Add("key", key);
var names = mf.GetAll(xe).ToList();
if (names.Count() < 2) throw new ArgumentException(
"LogicTest requires at least two entries.");
result.args.Add("items", names);
return result;
}
}
私の実際のコードは、工場は、2つの辞書、書き込み、実際のゲームオブジェクトを作成するために、リーダによって使用される別のコンテンツタイプにXElementオブジェクトを回すつを有する、より複雑です。
文字列を代理人にマップするため、これらのファクトリをコードで構築する必要があります。私はこれらの工場のいくつかを含むサービスを持っています。ミッションは、これらのファクトリクラスをコンテンツプロセッサで使用できるようにすることです。プロセッサ自体やパラメータとして使用するコンテキストは、IServiceProviderまたは同等のものを接続するための既知のフックを持っていません。
アイデア?