访问方法</t> </t>中从类(公共类TheClass <t>)传入的类型<t>

时间:2014-06-09 21:01:24

标签: c# generics

例如,我有一个班级:

 public class GenericController<T> : ApiController where T : BaseContext 
 {
    public string Get(int id) 
        {
            try
            {
                var obj = dataRepository.Get<T>(id);

                responseMessage.SetGetSuccess(obj);
            }
                catch (Exception e)
            {
                responseMessage.SetGetUnsuccess(e);
            }
            return responseMessage.ToJsonString();
        }
 }

这可能吗? 方法

中无法识别T.

错误信息是:

Error   16  'T' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'AppCore.NHibernateBases.DataRepositories.Interfaces.IDataRepository.Get<T>(int)' C:\Users\SeanPC\Google Drive\SideProject\DataAPI\DataAPI\Controllers\GenericController.cs   44  27  DataAPI

2 个答案:

答案 0 :(得分:2)

T在您的方法中得到认可。问题不同。它不适合您试图调用的Get方法的通用约束集。

  

&#39; T&#39;必须是具有公共无参数构造函数的非抽象类型才能将其用作参数&#39; T&#39;通用类型或方法&#39; AppCore.NHibernateBases.DataRepositories.Interfaces.IDataRepository.Get<T>(int)&#39;

要实现这一目标,您必须在班级中添加相同的约束:

public class GenericController<T> : ApiController where T : BaseContext, new()

答案 1 :(得分:1)

错误说明了一切,你错过了一个约束。 Get<T>方法需要一个not abstract类型且具有无参数构造函数的类型。

为了能够将T类型传递给Get,您必须更改约束:

 public class GenericController<T> : ApiController where T : BaseContext, new()
 {
    public string Get(int id) 
    {
        try
        {
            var obj = dataRepository.Get<T>(id);

            responseMessage.SetGetSuccess(obj);
        }
            catch (Exception e)
        {
            responseMessage.SetGetUnsuccess(e);
        }
        return responseMessage.ToJsonString();
    }
 }