C# 如何创建抽象构造函数或获取抽象类的类型并返回它?

C# 如何创建抽象构造函数或获取抽象类的类型并返回它?,c#,.net,constructor,json.net,abstract-class,C#,.net,Constructor,Json.net,Abstract Class,我无法使抽象类中的方法或构造函数正常工作 我基本上有几个数据契约类,它们扩展了我的抽象类,并且在它们内部有一个简单的、几乎相同的方法,我正在试图弄清楚如何移动到我的抽象类 我很确定构造函数是最有意义的,但我不知道正确的语法。要当前使用它,我将其称为: OrderLine OrderLine=new OrderLine() orderLine=orderLine.createFromJsonString(“MyJsonString”) 我试图将标记为(1)和(2)的方法作为方法或构造函数移动到(0

我无法使抽象类中的方法或构造函数正常工作

我基本上有几个数据契约类,它们扩展了我的抽象类,并且在它们内部有一个简单的、几乎相同的方法,我正在试图弄清楚如何移动到我的抽象类

我很确定构造函数是最有意义的,但我不知道正确的语法。要当前使用它,我将其称为:

OrderLine OrderLine=new OrderLine()

orderLine=orderLine.createFromJsonString(“MyJsonString”)

我试图将标记为(1)和(2)的方法作为方法或构造函数移动到(0)位置

abstract class Pagination<T>
{
    public int _offset { get; set; }
    public int _total { get; set; }
    public string previous { get; set; }
    public string next { get; set; }
    public abstract List<T> items { get; set; }

    public int getItemCount()
    {
        return items != null ? items.Count() : 0;
    }

    // (0)
    // Each of the child objects that extend this class are created from
    // a Json that is deserialized. So I'd rather some method that would
    // construct or return a new instance of the abstract object 
    /*
    public object createFromJsonString(string _json)
    {
     * // The main issue here is the "this" keyword
        return JsonConvert.DeserializeObject<this>(_json);
    }
     **/
    
}

class OrderHeader : Pagination<OrderLine>
{
    public int orderId { get; set; }
    public List<OrderLine> items { get; set; }

    // (1)
    // How can I move this into the abstract class?
    // Or should it be written as constructor?
    public OrderHeader createFromJsonString(string _json)
    {
        return JsonConvert.DeserializeObject<OrderHeader>(_json);
    }
}

class OrderLine : Pagination<OrderLineDetails>
{
    public string sku { get; set; }
    public int qty { get; set; }
    public List<OrderLineDetails> items { get; set; }

    // (2)
    // How can I move this into the abstract class?
    // Or should it be written as constructor?
    public OrderLine createFromJsonString(string _json)
    {
        return JsonConvert.DeserializeObject<OrderLine>(_json);
    }
}

class OrderLineDetails
{
    public string serialNum { get; set; }
}
抽象类分页
{
公共整数_偏移量{get;set;}
公共整数_total{get;set;}
前一个公共字符串{get;set;}
公共字符串next{get;set;}
公共抽象列表项{get;set;}
public int getItemCount()
{
返回项!=null?项。计数():0;
}
// (0)
//扩展此类的每个子对象都是从中创建的
//一个反序列化的Json。所以我更希望使用
//构造或返回抽象对象的新实例
/*
公共对象createFromJsonString(字符串_json)
{
*//这里的主要问题是“this”关键字
返回JsonConvert.DeserializeObject(_json);
}
**/
}
类OrderHeader:分页
{
公共int-orderId{get;set;}
公共列表项{get;set;}
// (1)
//如何将其移动到抽象类中?
//还是应该作为构造函数编写?
public OrderHeader createFromJsonString(字符串_json)
{
返回JsonConvert.DeserializeObject(_json);
}
}
类命令行:分页
{
公共字符串sku{get;set;}
公共整数数量{get;set;}
公共列表项{get;set;}
// (2)
//如何将其移动到抽象类中?
//还是应该作为构造函数编写?
公共医嘱行createFromJsonString(字符串_json)
{
返回JsonConvert.DeserializeObject(_json);
}
}
类OrderLineDetails
{
公共字符串serialNum{get;set;}
}

在这里,您做了一些不正确的事情:

// You have created object once here, this object would become unused in next line
OrderLine orderLine = new OrderLine();

// Here you are building a new object via Deserialize
orderLine = orderLine.createFromJsonString("MyJsonString");
我从您的问题中了解到的是,您希望有一个工厂方法来创建分页派生类型的对象

抽象类分页
{
公共整数_偏移量{get;set;}
公共整数_total{get;set;}
前一个公共字符串{get;set;}
公共字符串next{get;set;}
公共抽象列表项{get;set;}
public int getItemCount()
{
返回项!=null?项。计数():0;
}
/// 
///方法从Json字符串构建分页对象。
/// 
公共静态TCurrent CreateFromJsonString(string _json),其中TCurrent:Pagination
{
返回JsonConvert.DeserializeObject(_json);
}
}
现在,您可以构建派生类型的对象,如:

 OrderHeader hdr = Pagination<OrderLine>.CreateFromJsonString<OrderHeader>(json);

 OrderLine line = Pagination<OrderLineDetails>.CreateFromJsonString<OrderLine>(json);
OrderHeader hdr=Pagination.CreateFromJsonString(json);
OrderLine=Pagination.CreateFromJsonString(json);
factory方法还阻止执行以下操作,因为我们应用了泛型约束,因此只允许相关的项类型

// This will throw error of invalid implicit conversion
OrderHeader invalidObj = Pagination<OrderLineDetails>.CreateFromJsonString<OrderHeader>(json);
//这将引发无效隐式转换错误
OrderHeader invalidObj=Pagination.CreateFromJsonString(json);

尽管在这一点上,您想知道什么更有用:)
JsonConvert.DeserializeObject(json)
Pagination.CreateFromJsonString(json)
非常感谢!有很多东西可以接受。@jacob没有太大区别。但是工厂方法引入了带约束的包装器,这将有助于对象创建的一致性。你的回答也是一种方式有没有一种简单的方法可以用抽象构造函数来实现这一点?没有。。构造函数在对象创建期间执行意味着当反序列化方法尝试创建对象时,只有抽象构造函数才会执行。构造函数只能用于使用默认信息或提供的信息填充成员/属性。它无法创建自己类型的对象。
// This will throw error of invalid implicit conversion
OrderHeader invalidObj = Pagination<OrderLineDetails>.CreateFromJsonString<OrderHeader>(json);