传递未知参数问题的最佳解决方案是什么?

时间:2010-09-30 07:51:06

标签: c# asp.net

我的问题是这样的:

ASP DetailsView组件中,我们为不同的数据库操作提供了三种不同的EventArgs: DetailsViewInsertedEventArgsDetailsViewDeletedEventArgsDetailsViewUpdatedEventArgs

以上所有EventArgs都有共同的特点,我对其中两个感兴趣:ExceptionExceptionHandled。不幸的是,这两个属性在这些事件args的共同祖先中是不存在的。

我想创建一个这样的方法:

public void DoSomething(ref CommonAncestorForDVArgs args)
{

    if (args.Exception != null)
    {
        //do something with an exception
        args.ExceptionHandled = true;
    }
}

当然,由于我之前已经描述过,这是不可能的。 我想出的解决方案是:

public void DoSomething(Exception e, bool ExceptionHandled)
{

    if (e.Exception != null)
    {
        //do something with an exception
        ExceptionHandled = true;
    }
}

但我很怀疑是否有更好的东西?

3 个答案:

答案 0 :(得分:1)

您可以使用interface并从EventArgsinterface(或您使用的任何派生EventArgs)派生EventArgs,例如:< / p>

public interface ICommonAncestorForDVArgs
{
    Exception Exception { get; set; }
    bool ExceptionHandled { get; set; }
}

然后在DoSomething方法中使用此界面:

public void DoSomething(ref ICommonAncestorForDVArgs args)

编辑: 另一种方法是反思。您可以像这样编写DoSomething方法(此代码不包括错误检查):

public static void DoSomething<T>(ref T args)
{
    Exception e = args.GetType().GetProperty("Exception").GetValue(args, null) as Exception;

    if (e != null)
    {
        //do something with an exception

        typeof(CommonAncestorForDVArgs).GetProperty("ExceptionHandled").SetValue(args, true, null);
    }
}

答案 1 :(得分:0)

您可以使用重载来执行您想要的操作:

public void DoSomething (ref DetailsViewInsertedEventArgs args)
{
  DoCommonStuff (args);
  // do something with a DetailsViewInsertedEventArgs exception
}

public void DoSomething (ref DetailsViewDeletedEventArgs args)
{
  DoCommonStuff (args);
  // something with a DetailsViewDeletedEventArgs exception
}

public void DoSomething (ref DetailsViewUpdatedEventArgs args)
{
  DoCommonStuff (args);
  // do something with a DetailsViewUpdatedEventArgs exception
}

void DoCommonStuff (ref CommonAncestorForDVArgs args)
{
  // common stuff
}

答案 2 :(得分:0)

或者,使用Reflection:

public void DoSomething (ref CommonAncestorForDVArgs args)
{
  if (args.GetType () == typeof DetailsViewInsertedEventArgs || // syntax probably wrong here
      args.GetType () == some.other.type)
  {
    // do something with an exception
  }
}

在维护方面,它可能与我的其他答案没那么大不同。