在类构造函数中分配方法

时间:2018-02-26 02:20:42

标签: c# methods constructor

编辑:检查我在下面发布的答案。我创建了一个调用其他函数的代理方法。

我有一个类,我想从不同的类中分配方法。最好的方法是什么?

到目前为止,我已经尝试过了:

namespace LeagueProj.DataGrabber{
    public class DataGrabber : IDataGrabber
    {
        private SummonerMethod sm = new SummonerMethod();
        private MatchlistMethod mlm = new MatchlistMethod();
        private MatchMethod mm = new MatchMethod();

        public delegate Summoner GetSummoner();
        public delegate Matchlist GetMatchlist();
        public delegate Data GetAllMatchData();

        public DataGrabber()
        {
            GetSummoner = sm._GetSummoner;
            GetMatchlist = mlm._GetMatchlist;
            GetAllMatchData = mm._GetAllMatchData;
        }
    }
}

然而,IDE说在构造函数中,GetSummoner,GetMatchlist和GetAllMatchData是类型,但是像变量一样被使用(这是可以理解的)。我意识到我可能会犯这个错误,所以最好的办法是什么呢?

4 个答案:

答案 0 :(得分:1)

您声明了委托,但不是具有此类委托的字段:

public class DataGrabber : IDataGrabber
{
    private SummonerMethod sm = new SummonerMethod();
    private MatchlistMethod mlm = new MatchlistMethod();
    private MatchMethod mm = new MatchMethod();

    public delegate Summoner GetSummoner();
    public delegate Matchlist GetMatchlist();
    public delegate Data GetAllMatchData();

    public GetSummoner Method1;
    public GetMatchlist Method2;
    public GetAllMatchData Method3;

    public DataGrabber()
    {
        Method1 = sm._GetSummoner;
        Method2 = mlm._GetMatchlist;
        Method3 = mm._GetAllMatchData;
    }
}

答案 1 :(得分:1)

您需要:

  • 将代表移到课堂外(不是强制性的,但通常按其完成的方式)
  • 添加委托类型的构造函数参数
  • 将构造函数中传递的值赋给类级变量

示例:

internal class MyClass
{
    public MyClass(GetElement getElement)
    {
        GetElement = getElement;
    }

    public GetElement GetElement { get; }
}

internal delegate Element GetElement();

internal class Element
{
}

答案 2 :(得分:0)

您可以使用操作

执行此操作
public class MyActioner
{
    private Action MyAction;

    public MyActioner()
    {
        MyAction = () => MyActionMethod();
    }

    public void MyActionMethod() 
    {

    }
}

答案 3 :(得分:0)

好吧,所以朋友向我建议我只是代理这些方法并让它们返回其他方法。这是一个更好的主意,imo。以下是未来参考的代码:

namespace LeagueProj.DataGrabber
{
    public class DataGrabber
    {
        private SummonerMethod sm;
        private MatchlistMethod mlm = new MatchlistMethod();
        private MatchMethod mm = new MatchMethod();

        public Summoner GetSummoner(string summonerName) { return sm._GetSummoner(summonerName); }
        private List<Matchlist> GetMatchlist(long accountId) { return mlm._GetMatchlist(accountId); }
        public List<Data> GetAllMatchData(List<Matchlist> matchlist, long accountId) { return mm._GetAllMatchData(matchlist, accountId); }
    }
}