【问题标题】:Better way of rewriting below method [duplicate]重写以下方法的更好方法[重复]
【发布时间】:2019-10-28 05:56:21
【问题描述】:

我有以下方法可以正常工作,但我相信我们可以通过一些方法摆脱这些 if 条件来使其变得更好,但不确定如何?

 protected void SaveSession<T>(T sessionProperty, Management management) where T : class
        {
            string propertyType = typeof(T).Name;

            if (propertyType.Equals(typeof(A).Name))
            {
                management.A = sessionProperty as A;
            }
            else if (propertyType.Equals(typeof(B).Name))
            {
                management.B = sessionProperty as B;
            }
            else if (propertyType.Equals(typeof(C).Name))
            {
                management.C = sessionProperty as C;
            }

            Session["mysession"] = management;
        }

我使用的是最新的 C# 版本 7.0

【问题讨论】:

  • 您使用的是哪个 C# 版本?在 C# 7 及更高版本中,您可以使用模式匹配 switch 语句
  • 我使用的是最新的 C# 版本
  • 在管理中获取一个 ArrayList 属性。使用 Enumerable.OfType() 过滤并添加/设置 sessionProperty 变量。
  • 听起来是策略模式的好地方。除此之外,不要比较类型名称,直接比较类型即可。
  • @User 最新发布的版本是 7.3。最新的 preview 版本是 8.0。我假设您使用 C# 7.3,或者至少是 C# 7?

标签: c# asp.net-mvc optimization c#-7.3


【解决方案1】:

在 C# 7 及更高版本中,您可以使用模式匹配 switch 语句,例如:

switch(sessionProperty)
{
    case A a:
        management.A=a;
        break;
    case B b:
        management.B=b;
        break;
    case C c:
        management.C=c;
        break;
}

在早期版本中,您可以使用is 运算符来检查类型,例如:

if (sessionProperty is A)
{
    management.A=(A)sessionProperty;
}
else if (sessionProperty is B)
{
    management.B=(B)sessionProperty;
}

【讨论】:

  • 对不起,我正在使用我正在使用最新的 C# 版本 7.0
  • 如果 Management 可以更改,我建议在其中添加 ArrayList 属性 + .OfType&lt;T&gt;()
  • @User 模式匹配在 C# 7 中工作
  • @bradbury9 为什么要这样做?
  • 减少管理中的属性数量。似乎是一个糟糕的设计
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
相关资源
最近更新 更多