我的问题是这样的:
在ASP
DetailsView
组件中,我们为不同的数据库操作提供了三种不同的EventArgs:
DetailsViewInsertedEventArgs
,DetailsViewDeletedEventArgs
,DetailsViewUpdatedEventArgs
。
以上所有EventArgs都有共同的特点,我对其中两个感兴趣:Exception
和ExceptionHandled
。不幸的是,这两个属性在这些事件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;
}
}
但我很怀疑是否有更好的东西?
答案 0 :(得分:1)
您可以使用interface
并从EventArgs
和interface
(或您使用的任何派生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
}
}
在维护方面,它可能与我的其他答案没那么大不同。