0

如果我有这样的方法签名;

public void Execute(Action<T> action) {
    ...
}

但我想对其进行限制,以便提供的“动作”仅来自“MyActions”类,这如何在 c# 中实现?


为了尝试并使其更清晰;

例如,我有一个名为 MyActions 的类;

public class MyActions {
    public void FirstAction<T>(T item) {
        ...
    }

    public void SecondAction<T>(T item) {
        ...
    }
}

我有上述方法并且我想要它,以便该方法将接受的唯一操作是来自此类的操作。

我不希望任何人都可以提供任意动作,它们必须来自“MyActions”类。

可以做到吗?

问候,

瑞安。

4

4 回答 4

2

明确您只想接受成员的意图的一种方法MyActions是:

public void Execute(Func<MyActions, Action<T>> actionSelector)

然后你可以这样称呼它

Execute(actions => actions.SomeAction);

当然,这只有在方法(或委托属性)MyActions不是静态的情况下才有效。

就像我说的那样,这使您的意图清晰,但实际上并没有限制方法,有人仍然可以像这样调用您的方法:

Execute(ignored => otherAction);

总的来说,这在我看来是一件很奇怪的事情。

于 2012-05-05T00:25:54.683 回答
1
public sealed class MyActions <T> where T:new()
{ 
    public enum Methods { First, Second }  

    static Action<T>[] MethodsArray = { Method1, Method2 };
    public virtual void Execute(T value, Methods methods = Methods.First)
    {
        MethodsArray[(int) methods].Invoke(value);
    }
    private void Method1(T value) {}
    private void Method2(T value) {}

}

//public class MiActionsSeconds<T> : MyActions <T>    where T:new()
// {
//     public override void Execute( T value, Methods methods = Methods.Second )
//     {
//         base.Execute( value, methods );
//     }
// }

public class Foo<T>  where T:new()
{
    public void Execute(MyActions<T> instance, MyActions<T>.Methods methods = Methods.First)
    {
        instance.Execute( default( T ) );
        instance.Execute( default( T ), MyActions<T>.Methods.Second );
    }

    public void Test()
    {
      //  Execute( new MiActionsSeconds<T>( ) );
    }
}
于 2012-05-05T00:17:08.637 回答
1

你可以使用反射来做到这一点,但它会损害性能,我不推荐它,因为它只是一个坏主意。我认为您应该尝试一个不太具体的问题;告诉我们您想要实现的目标如何引导您走上这条道路,也许我们可以帮助您以另一种方式实现这一目标。

于 2012-05-05T00:19:33.647 回答
0

这样做的一个大问题是,一旦你Action<...> foo = MyActions.FirstAction进入,Execute你就检索了一个值,它的类型是简单的Action<...>. 类型中没有任何内容表明它以前存储在MyActions. 您可以通过比较引用来检查是否MyActions包含正在传递的操作,但这是运行时检查。

将此信息放入类型中的一种部分方法是拥有一个MyAction类,其中的所有内容都MyActions派生自一个类。然后你可以限制Execute采取MyAction实例。但是,用户可以像创建自己的MyAction子类一样容易。

这闻起来像是不必要的内部暴露:如果只有那一小部分Action工作,那你为什么要向用户要一个Actionenum允许用户指定意图或仅指定几种不同方法Execute的更有意义。

于 2015-08-30T16:09:22.443 回答