謝謝大家再次,結果在第一種方法如下
public class Component
{
public ComponentPart SomeComponentPart1 { get; private set; }
public ComponentPart SomeComponentPart2 { get; private set; }
public Component()
{
SomeComponentPart1 = new ComponentPart(this);
SomeComponentPart2 = new ComponentPart(this);
}
public bool IsMethodCallAcceptable(MethodCallExpression method, object[] parameters)
{
// collect needed information about caller
var caller = (method.Object as ConstantExpression).Value;
var methodName = method.Method.Name;
var paramsArray = new Dictionary<string, object>();
for (int i = 0; i < method.Arguments.Count; i++)
paramsArray.Add((method.Arguments[i] as MemberExpression).Member.Name, parameters[i]);
// make corresponding decisions
if (caller == SomeComponentPart2)
if (methodName == "SomeMethod")
if ((int) paramsArray["intArg"] == 0 || (string) paramsArray["stringArg"] == "")
return false;
return true;
}
}
public class ComponentPart
{
private Component Owner { get; set; }
public ComponentPart(Component owner)
{
Owner = owner;
}
public int SomeMethod(int intArg, string stringArg)
{
// check if the method call with provided parameters is acceptable
Expression<Func<int, string, int>> expr = (i, s) => SomeMethod(intArg, stringArg);
if (!Owner.IsMethodCallAcceptable(expr.Body as MethodCallExpression, new object[] { intArg, stringArg }))
throw new Exception();
// do some work
return stringArg.Length + intArg;
}
public void AnotherMethod(bool boolArg, Dictionary<Guid, DateTime> crazyArg, string stringArg, object objectArg)
{
// check if the method call with provided parameters is acceptable
Expression<Action<bool, Dictionary<Guid, DateTime>, string, object>> expr =
(b, times, arg3, arg4) => AnotherMethod(boolArg, crazyArg, stringArg, objectArg);
if (!Owner.IsMethodCallAcceptable(expr.Body as MethodCallExpression, new [] { boolArg, crazyArg, stringArg, objectArg }))
throw new Exception();
// do some work
var g = new Guid();
var d = DateTime.UtcNow;
}
}
這是變異如何檢查方法調用上市,同樣的方法也以檢查屬性中使用的值的變化,而一些ComponentPart的方法和屬性可以檢查一些公共的Component.State屬性(通過ComponentPart.Owner)而不是調用Component.IsMethodCallAcceptable或Component.IsPropertyChangeAcceptable。
來源
2012-07-22 09:44:26
JSP
感謝所有值得尊敬的對話參與者。可能是由於缺乏英語經驗,我以不正確的方式使用了一些術語。 – JSP 2012-07-21 18:48:40
該主題不是父類在子類(OOP範式)中的關係,而是組件的單獨部分和通用組件代碼之間的關係。例如,我們有一個組件CAR,它由四個WHEEL,一個ENGINE等組成。我們可以調用CAR.ENGINE.START,但是如果CAR.FUEL_TANK.GASOLINE_VOLUME = 0,我們的CAR不能移動,所以它的引擎啓動不正確。所以我需要檢查組件的部件方法調用,並且我的CAR對這些方法足夠了解。 – JSP 2012-07-21 18:57:53
現在使用的代表看起來最接受,謝謝你,海德里安。但是我需要寫很多代表,同時想寫一個通用的檢查方法。 – JSP 2012-07-21 18:59:50