Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在基类事件参数中检索作为发送方的子类实例?_C#_Oop - Fatal编程技术网

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”会有所帮助。