在C#中尝试捕获属性的优雅方法是什么?

Chi*_*han 4 c# refactoring try-catch

重构此代码的优雅方法是什么?

说,我有以下对象

public class SomeObject
{
    public SomeInnerObject1 Cat { get; set; }
    public SomeInnerObject2 Dog { get; set; }

    public class SomeInnerObject1
    {
        public int Age { get; set; }

        public string AgeAsString
        {
            get
            {
                if(Age < 0 )
                    throw new Exception();

                return Age.ToString();
            }
        }
    }

    public class SomeInnerObject2
    {
        public string BirthDayString { get; set; }
        public DateTime BirthDay { get { return DateTime.Parse(BirthDayString); } }
    }
}
Run Code Online (Sandbox Code Playgroud)

并说,我必须设置一些我需要设置的文本框值

var obj = new SomeObject
          {
              Cat = new SomeObject.SomeInnerObject1 {Age = -1},
              Dog = null
          };

//These will pass but it looks ugly
try
{
    textbox1.Text = obj.Dog.BirthDay.Month.ToString();
}
catch{ }

try
{
    textbox2.Text = obj.Cat.AgeAsString;
}
catch { }

//These will fail
textbox1.Text = obj.Dog.BirthDay.Month.ToString();
textbox2.Text = obj.Cat.AgeAsString;
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

谢谢,

Kal*_*son 6

当我真的不关心特定代码行会发生什么时,我会这样做:

ExecuteIgnoringExceptions(() => textBox.Text = Some.Possibly.Bad.Value);

void ExecuteIgnoringExceptions(Action a) 
{
    try
    {
        a.Invoke();
    }
    catch
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我不认为`Invoke`使用反射.直接调用委托只是`Invoke`的语法糖 (2认同)