在C#4.0中干掉一个dynamicexpression

时间:2010-09-29 10:27:11

标签: c#

我有以下代码,我想重构出来的重复:

    public bool HasBia
    {
        get 
        {
            if (IsC2User())
            {
                return true;
            }

            if(_hasBia == null)
            {
                _hasBia = _excludes.HasBia; 
            }

            return _hasBia.Value;
        }
    }

    public bool HasTeachAndTest
    {
        get
        {
            if (IsC2User())
            {
                return true;
            }

            if(_hasTeachAndTest == null)
            {
                _hasTeachAndTest = _excludes.HasTeachAndTest;
            }

            return _hasTeachAndTest.Value;
        }
    }

我遇到麻烦的是,_excludes.HasBia和_excludes.HasTeachAndTest是动态表达式或动态属性,由TryGetMember从继承自DynamicObject的类解析。

我想我想做这样的事情:

public bool HasPermission(bool? value, DynamicExpression expression)
{
    if (IsC2User())
    {
        return true;
    }

}

然后我可以这样称呼它:

return HasPermission(_hasBia, _excludes.HasTeachAndTest);

但我不确定如何在将表达式传递给HasPermission方法时调用该表达式。

有人有任何想法吗?

2 个答案:

答案 0 :(得分:0)

也许这会奏效。

public bool HasPermission(ref bool? field, bool defaultValue)
{
    if (IsC2User())
    {
        return true;
    }
    if (field == null)  //lazy loading a bool? overkill?  :)
    {
        field = defaultValue;
    }
    return field;
}

//usage
public bool HasBia
{
    get 
    {
        return HasPermission(ref _hasBia, _excludes.HasBia);
    }
}

或者,如果存在检索默认值的副作用

public bool HasPermission(ref bool? field, Func<bool> getDefaultValue)
{
    if (IsC2User())
    {
        return true;
    }
    if (field == null)
    {
        field = getDefaultValue();
    }
    return field;
}

//usage
public bool HasTeachAndTest
{
    get
    {
        return HasPermission(ref _hasTeachAndTest, () => _excludes.HasTeachAndTest);
    }
}

答案 1 :(得分:0)

我认为删除这种重复没有任何意义,考虑任何可能的解决方案引入的额外复杂性与在两个地方重复模式的简单性。

或许您真正缺少的是您在问题域中的一个概念,您试图在解决方案域中进行复制。 Jeff M的解决方案在技术实现方面很好,但在这个简单的情况下我不会使用它。