【问题标题】:Is there are way to combine "is" and "as" in C# [duplicate]有没有办法在C#中结合“is”和“as”[重复]
【发布时间】:2011-09-19 21:58:42
【问题描述】:

可能重复:
C# - Assignment in an if statement

我发现自己多次执行以下操作

if (e.row.FindControl("myLiteral") is Literal)
{
    (e.row.FindControl("myLiteral") as Literal).Text = "textData";
}

有没有办法替换“if”部分并简化setter:

(e.row.FindControl("myLiteral") <some operator that combines is and as> .text = "textData";

编辑: 我应该在之前提到这一点- 我想完全删除“如果”。
“some operator” 应该在内部执行此操作,并且仅当 e.row.FindControl 是文字时才设置“.text”

【问题讨论】:

  • as 已经为您执行了一个 is 并在 is 不是某种类型时返回 null。
  • 嘿,MS 听到了我的声音 - 供将来参考:(e.row.FindControl("myLiteral"))??.text =="TextData";

标签: c#


【解决方案1】:

通常我不会像这样开始组合它们 - 我会要么使用演员表我会使用as和一个空检查:

Literal literal = e.row.FindControl("myLiteral") as Literal;
if (literal != null)
{
    literal.Text = "textData";
}

【讨论】:

    【解决方案2】:

    没有内置的方法可以做到这一点。但是,您可以编写一个扩展方法来为您提供此功能

    public static void AsType<T>(object o, Action<T> action) where T : class
    {
        var value = o as T;
        if (value != null)
        {
            action(value);
        }
    }
    

    然后你可以写

    e.row.FindControl("myLiteral").AsType<Literal>(l => l.Text = "textData");
    

    【讨论】:

      【解决方案3】:

      as 运算符已经做了一个 is。如果转换成功,则返回转换后的值,否则返回 null。

      Literal lit = e.row.FindControl("myLiteral") as Literal;
      if (lit != null)
      {
          lit.Text = "textData";
      }
      

      if (e.row.FindControl("myLiteral") is Literal)
      {
          Literal lit = (Literal)e.row.FindControl("myLiteral");
          lit.Text = "textData";
      }
      

      【讨论】:

        【解决方案4】:

        使用is 的检查通常后跟强制转换:

        if (e.row.FindControl("myLiteral") is Literal)
        {
            ((Literal)e.row.FindControl("myLiteral")).Text = "textData";
        }
        

        as 用作这样的检查,它将成功转换的实例或null 返回到分配的变量,然后您可以检查null(请参阅@Jon Skeet's answer)。

        【讨论】:

          【解决方案5】:

          你可以这样做:

          var literal = e.row.FindControl("myLiteral") as Literal;
          if (literal != null)
          {
              literal.Text = "textData";
          }
          

          【讨论】:

            【解决方案6】:

            好吧,你可以像这样使用as(标准用法):

            Literal lit = e.row.FindControl("myLiteral") as Literal;
            if (lit != null) {
              lit.Text = "textData";
            }
            

            如果您使用的是 .Net 3.5 或更高版本,您可以创建一个扩展方法来处理这个(某种):

            internal static class Extensions {
              internal static void SetTextLiteral(this Control c, string text) {
                Literal lit = c as Literal;
                if (lit != null)
                  lit.Text = text;
              }
            }
            
            void Sample() {
              e.row.FindControl("myLiteral").SetTextLiteral("textData");
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-02-23
              • 2016-04-15
              • 1970-01-01
              • 2015-02-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-10-20
              相关资源
              最近更新 更多