对类中的不同变量运行相同的方法

时间:2018-07-27 13:17:34

标签: c# asp.net-mvc asp.net-core

我有一个带有大约10个或更多不同布尔值的类,用于记录用户是否执行了特定的操作,这些操作将给予他们特定的奖励(例如,向某人发送消息)。

以下是一种bool / action方法的代码:

private ReqRewardResult setMsgSent(RewardClass reward, RewardInfo info)
{
    if (reward.msgSent)
        return ReqRewardResult.RewardAlreadyGiven;

    reward.msgSent = true;
    reward.earned += info.msgSentReward;
    return ReqRewardResult.ReqSuccess;
}

我试图为此创建一个通用方法,但是似乎您不能将类变量作为引用?

private ReqRewardResult setRewardAction(ref bool bAction, RewardClass reward, int reward)
{
    if (bAction)
        return ReqRewardResult.RewardAlreadyGiven;

    bAction = true;
    reward.earnedTokens += reward;
    return ReqRewardResult.ReqSuccess;
}

然后我研究了几种方法,例如使用委托函数...但是这有点没有意义,因为我不得不再次重复几行...

我还看到您可以使用Reflection ......但这确实很慢,因为这是一个Web应用程序,所以我希望使用更多重复的代码,如果它可以提高整体速度...

问题:总有没有一个类函数可以重复使用同一类型的多个变量而不会影响性能?

注意:此类是从数据库加载的数据,并且对于每个用户都是唯一的(可能有数百万个用户)

非常感谢,

菲尔。

2 个答案:

答案 0 :(得分:0)

class RewardCredit
{
   public bool Rewarded { get; set; }

   public int Points { get; set; }
}

您可以使用Dictionary<string, RewardCredit>,将奖励名称作为字符串填充,并具有

之类的功能。
void ApplyReward(string rewardName)
{
    if (!rewards.ContainsKey(rewardName))
    {
        return;
    }

    RewardCredit credit = rewards[rewardName];
    if (!credit.Rewarded)
    {
        tokens += credit.Points;
        credit.Rewarded = true;
    }
}

然后您将像这样

Dictionary<string, RewardCredit> rewards = new Dictionary<string, RewardCredit>
{
    { "Message", new RewardCredit { Points = 10 } },

};

ApplyReward("Message");

答案 1 :(得分:0)

首先,您似乎已经完成并知道了一组可能的用户操作,如果用户执行了这些操作,则可以使用“令牌”进行奖励。 可以使用以下类来实现:

public sealed class UserAction
{
    public static UserAction SendMessage = new UserAction(3);
    public static UserAction PhonedFriend = new UserAction(4);
    public static UserAction LikedPost = new UserAction(1);
    public static UserAction CommentedOnPost = new UserAction(2);
    private UserAction(int tokens) => Tokens = tokens;
    public int Tokens { get; }
}

注意:

  • 将构造函数设为私有,并且只有预定义的名称和令牌可以使用该类中必须存在的几个实例
  • 该类经过密封,以避免被继承,因此实际上无法创建除您提供的实例之外的其他实例

那么,据我所知,每个用户可能已经执行(或未执行)每个动作,但每个用户的奖励不得超过一次。这使我认为您需要将这些UserAction的集合存储到User中。您还需要一种向用户添加操作的方法(例如,当用户有效地在UI上操作时),并且还需要知道每个用户获得了多少令牌。下面的类实现了这种行为:

public sealed class User
{
    private readonly HashSet<UserAction> _doneActions;
    public User() => _doneActions = new HashSet<UserAction>();
    public ReqRewardResult AddAction(UserAction action) => _doneActions.Add(action) ? ReqRewardResult.ReqSuccess : ReqRewardResult.RewardAlreadyGiven;
    public int EarnedTokens => _doneActions.Sum(ua => ua.Tokens);
}

注意:

  • 我正在利用HashSet.Add()的返回值来确定该操作是否已在过去完成

这种“对象思维”解决方案的优点:

  • 没有更多的布尔值和if,我相信它们可以使您的代码更易于维护和清晰
  • 简单添加新的UserAction(一个LoC)