C# 如何在基类事件参数中检索作为发送方的子类实例?
我有一个名为C# 如何在基类事件参数中检索作为发送方的子类实例?,c#,oop,C#,Oop,我有一个名为DataModel的类,它实现了INotifyDataErrorInfo接口。在我的应用程序中,我的所有模型都继承自此应用程序,因此我不必编写错误处理逻辑代码,也不必更改任何其他类中的通知。如何引发下面的基类事件,但将调用它的子类作为发送方发送?我希望尽量减少重复代码,并希望避免整个虚拟和重写场景 virtual void SetErrors(string propertyName, List<string> propertyErrors) { //clear a
DataModel
的类,它实现了INotifyDataErrorInfo
接口。在我的应用程序中,我的所有模型都继承自此应用程序,因此我不必编写错误处理逻辑代码,也不必更改任何其他类中的通知。如何引发下面的基类事件,但将调用它的子类作为发送方发送?我希望尽量减少重复代码,并希望避免整个虚拟和重写场景
virtual void SetErrors(string propertyName, List<string> propertyErrors)
{
//clear any errors that already exist for this property
errors.Remove(propertyName);
//add the list of errors for the specified property
errors.Add(propertyName, propertyErrors);
//raise the error notification event
if (ErrorsChanged != null)
ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
}
virtual void SetErrors(字符串propertyName、列表propertyErrors)
{
//清除此属性已存在的所有错误
错误。删除(propertyName);
//添加指定属性的错误列表
添加(propertyName、propertyErrors);
//引发错误通知事件
if(ErrorsChanged!=null)
ErrorsChanged(这是新数据ErrorSchangedEventArgs(propertyName));
}
编辑-问题不够清楚
比如说我有这个班
public class GangMember : Models.Base_Classes.DataObject
{
int _age;
public int Age
{
set
{
_age = value;
if (value < 0)
{
List<string> errors = new List<string>();
errors.Add("Age can not be less than 0.");
SetErrors("Age", errors);
}
}
}
}
公共类帮派成员:Models.Base\u Classes.DataObject
{
国际年龄;
公共信息
{
设置
{
_年龄=价值;
如果(值<0)
{
列表错误=新列表();
错误。添加(“年龄不能小于0”);
设置错误(“年龄”,错误);
}
}
}
}
当在我的基类
DataModel
中调用SetErrors()
时,它将引发它的事件ErrorsChanged
,并将自身的一个实例传递给它this
。在这种情况下,如何获取对子类帮派成员的引用?此
始终指向被调用的类,而不是实现类
public class A
{
public void PrintType()
{
Console.WriteLine(this.GetType().ToString());
}
}
public class B : A
{
}
// ...
new B().PrintType(); // This will give "B", not "A".
此
始终指向被调用的类,而不是实现类
public class A
{
public void PrintType()
{
Console.WriteLine(this.GetType().ToString());
}
}
public class B : A
{
}
// ...
new B().PrintType(); // This will give "B", not "A".
不知道你在问什么,如果你需要传递子类的类型,只需使用this.GetType()
,因为它来自实例,它会拉取子类,而不是父类。实际上,基类也可以使用this.GetType()
,它仍然会得到子类类型。所以你甚至不需要把它作为一个参数来传递。@Jon那么在我上面提到的场景中,它会返回我的ganglemember
类吗?我认为关键字this
总是返回对正在执行的类的引用,在这种情况下,将是基类?对,“this”返回当前实例化的类。但是实例化的类和包含代码的类在运行时是不同的。因此,使用“this”会有所帮助。不确定你在问什么,如果你需要传递子类的类型,只需使用this.GetType()
,因为它来自实例,它会拉取子类,而不是父类。实际上,基类也可以使用this.GetType()
,它仍然会得到子类类型。所以你甚至不需要把它作为一个参数来传递。@Jon那么在我上面提到的场景中,它会返回我的ganglemember
类吗?我认为关键字this
总是返回对正在执行的类的引用,在这种情况下,将是基类?对,“this”返回当前实例化的类。但是实例化的类和包含代码的类在运行时是不同的。所以,使用“this”会有所帮助。