转换类和设置公共值

本文关键字:设置 转换 | 更新日期: 2023-09-27 17:49:49

我们有一系列的类,它们都是从一个共同的类派生出来的:

public class OurBaseClass
{
    public string StatusMessage { get; set;}
    [other properties]
}
public class ProcessClass : OurBaseClass
{
    public string SomeProcessInformation { get; set;}
    public string SomeMoreProcessInformation { get; set;}
    [other properties]
}

然后我们尝试创建一个函数来设置SpecificProcessClass和当前的基本属性(这不起作用):

public object DefaultResponse(string messageText)
{
    return new OurBaseClass
    {
        StatusMessage = messageText,
        [other properties] = ...
    }
};

的目的是我们可以有

ProcessClass resp = (ProcessClass) DefaultResponse("Some Message");
resp.SomeProcessInformation  = "";
resp.SomeMoreProcessInformation  = "";
[other properties] = ...
return resp;

原因,是为了尽量减少重复编码的数量,并使函数易于阅读(通过眼睛);这将抛出以下错误。

System.InvalidCastException: Unable to cast object of type 'OurBaseClass' to type 'ProcessClass'

而不是完全惊讶的结果,作为ProcessClass是从OurBaseClass派生的,我认为这是可能的,只是不确定如何…

转换类和设置公共值

不能从派生程度较低的类型强制转换为派生程度较高的类型,首先需要创建派生程度较高的类型。

一个类似于当前代码的解决方案是使用泛型:
public T DefaultResponse<T>(string messageText)
    where T : OurBaseClass, new()
{
    return new T
    {
        StatusMessage = messageText,
    };
}

where约束将T限制为OurBaseClass或派生类型,new()约束意味着T必须具有无参数构造函数。您可以在文档

中了解更多有关它们的信息。

可以这样使用:

ProcessClass resp = DefaultResponse<ProcessClass>("Some Message");
resp.SomeProcessInformation  = "";
resp.SomeMoreProcessInformation  = "";

如何在基类中创建一个方法来设置公共属性,然后有一个虚拟方法,可以在子类中重写,每个子类都调用基方法。

public class OurBaseClass
{
    public string StatusMessage { get; set;}
    // other properties
    protected void BaseInit()
    {
        // Set common properties here...
    }
    public virtual void Init()
    {
        BaseInit();
    }
}
public class ProcessClass : OurBaseClass
{
    public string SomeProcessInformation { get; set;}
    public string SomeMoreProcessInformation { get; set;}
    public override void Init()
    {
        BaseInit();
        // Set specific properties here...
    }
}