C# 如何根据指定变量来实例化对象?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 如何根据指定变量来实例化对象?相关的知识,希望对你有一定的参考价值。

我有一个方法,方法的参数约束了传入的参数必须实现某个接口。我想在这个方法里面从新创建实例化一个以当前参数类型的实例 该如何操作

class Program

static void Main(string[] args)




static void C(IA a)

//我需要在这里从新创建一个 a类型的实例



interface IA

int Id get; set;


public class B:IA

public int Id get; set;

有两个函数可以动态创建实例,下面的b和c都是object类型,使用的时候强制转换就可以了,如果你在编译的时候不确定具体类型可以使用dynamic关键字声明一个动态变量如 dynamic d=b;然后使用d执行你的操作。编译器编译期间不会检查dynamic关键字修饰的成员,如果你的代码有错误会在运行时报错
static void C(IA a)

//我需要在这里从新创建一个 a类型的实例
Type t = a.GetType();
var b = System.Activator.CreateInstance(a.GetType());
var c = t.Assembly.CreateInstance(t.Name);
参考技术A static void C<T>(IA a) where T : IA, new()

new T();
//我需要在这里从新创建一个 a类型的实例
本回答被提问者采纳
参考技术B static void C<T>(IA a) where T : IA, new()

new T();
//我需要在这里从新创建一个 a类型的实例

通过 id 实例化 dto 对象,其中对象作为有效负载 C#

【中文标题】通过 id 实例化 dto 对象,其中对象作为有效负载 C#【英文标题】:Instantiate dto object by id where object received as payload C# 【发布时间】:2019-11-16 14:49:57 【问题描述】:

有一个任务控制器函数接收 DTO JSON 中的有效负载。现在是否插入或更新取决于在有效负载数据中接收到的 id。如何实例化具有 id 值的对象。

任务控制器:

async Task<Response<RequestDto>> UpdateRequest([FromBody]RequestDto req)

我必须根据请求对象的 id 值更新/插入。

我应该使用构造函数来 RequestDto 还是通过 null 检查分配 id 值

编辑

这里的 DTO 结构:

namespace MyWorkspace.ProjectA.Domain

    /// <summary>
    /// Request DTO
    /// </summary>
    public class RequestDto
    
        /// <summary>
        /// Request Id
        /// </summary>
        [RegularExpression(Constants.GuidRegex)]
        public string RequestId  get; set; 
        [JsonConverter(typeof(StringEnumConverter))]
        public RequestDetails RequestDetails  get; set; 
        public DateTime OpenDate  get; set; 
        **public RequestDto()
        
            RequestId = Guid.NewGuid().ToString("N");
        **
    

现在我必须根据 ID 更新/插入请求,其中 2 种类型的请求有效负载可以通过以下方式:

1. 
  "reqId": "",
  "requestDetails": 
    "basicDetails": 
      "firstName": "Something",
      "lastName": "Something",
      "emailAddress": "Something",
    ,
        "addressDetails": 
      "addLine1": "Something",
      "addLine2": "Something",
      "city": "Something",
      "state": "Something",
      "country": "Something",
    
  ,
  "openDate": "2019-07-05T09:59:18.601Z",

2. 
  "reqId": "0b5c7dd3931944b28f693ef8bf6fa2ad",
  "requestDetails": 
    "basicDetails": 
      "firstName": "Something",
      "lastName": "Something",
      "emailAddress": "Something",
    ,
        "addressDetails": 
      "addLine1": "Something",
      "addLine2": "Something",
      "city": "Something",
      "state": "Something",
      "country": "Something",
    
  ,
  "openDate": "2019-07-05T09:59:18.601Z",

问题:我需要 DTO 中的构造函数吗?如何将 ID 分配给 DTO 对象/或者我应该分配一个新的 ID,以防空白:

public async Task<Response<RequestDto>> UpdateRequest([FromBody]RequestDto req)

    req.RequestId = (req.RequestId == null || req.RequestId == "") ? Guid.NewGuid().ToString("N") : req.RequestId;
    _validatorObj.ValidateAndThrow(req, ruleSet: "RequestValidation");
    var result = await _repository.UpsertRequest(req);

    return Response<RequestDto>.Ok(result, "Success");

代码库中的代码:

public async Task<RequestDto> UpsertRequest(RequestDto req)

    var jsonReqDet = JsonConvert.SerializeObject(req.requestDetails);
    var entity = _mapper.Map<RequestEntity>(req);
    entity.RowKey = RequestEntity.GetRowKey(req.RequestId);
    entity.PartitionKey = RequestEntity.GetPartKey(req.RequestId);
    entity.RequestDetails = jsonReqDet;
    entity.OpenDate = DateTime.UtcNow;
    await AzureTableAdapter.Upsert(entity, RequestTableName);

    return req;

注意:

    我在有效载荷中获取整个 DTO 对象 我正在使用 Azure 存储和“插入或替换”操作 我有 requestDetils 字段作为字符串的请求表,以保留 json 值

我该怎么办?

【问题讨论】:

我不太清楚你在这里的意思。您能否更具体地说明您要做什么? id的数据类型是什么? @BhanuChhabra 字符串在这里 @RahulSharma,我已经用代码解释了我的问题 @aniruddha 您不需要在 DTO 类中使用构造函数,因为您正在接收请求。从外观上看,您为分配 RequestId 所做的事情是正确的。唯一的例外可能是您的 RequestId 收到了 null。我相信你会在你的代码中处理这个问题。 【参考方案1】:

终于

我发现我做错了什么。有效载荷包含reqId=""。所以即使我有一个构造函数:

public RequestDto()

    RequestId = Guid.NewGuid().ToString("N");

在初始化之后,由于控制器签名:

public async Task<Response<RequestDto>> UpdateRequest([FromBody]RequestDto req)

用 null 初始化的 id。所以我只从有效负载中删除了reqId(在插入期间)。我现在接受的最终有效载荷:

1. 
  "requestDetails": 
    "basicDetails": 
      "firstName": "Something",
      "lastName": "Something",
      "emailAddress": "Something",
    ,
        "addressDetails": 
      "addLine1": "Something",
      "addLine2": "Something",
      "city": "Something",
      "state": "Something",
      "country": "Something",
    
  ,
  "openDate": "2019-07-05T09:59:18.601Z",

2. 
  "reqId": "0b5c7dd3931944b28f693ef8bf6fa2ad",
  "requestDetails": 
    "basicDetails": 
      "firstName": "Something",
      "lastName": "Something",
      "emailAddress": "Something",
    ,
        "addressDetails": 
      "addLine1": "Something",
      "addLine2": "Something",
      "city": "Something",
      "state": "Something",
      "country": "Something",
    
  ,
  "openDate": "2019-07-05T09:59:18.601Z",

【讨论】:

以上是关于C# 如何根据指定变量来实例化对象?的主要内容,如果未能解决你的问题,请参考以下文章

C++只能实例化1个对象的类

如何通过指定每个属性及其值来实例化 TypeScript 中的对象?

C#怎么实例化对象?具体是实例化啥?

java中的实例化对象有啥用???????

C#为啥接口可以实例化一个实现该接口的类?

c# 中类的实例化