簡體   English   中英

該類型不能用作通用類型或方法中的類型參數

[英]The type cannot be used as type parameter in the generic type or method

我有一個DBHelper類,可以從該類中觸發將IDataReader轉換為通用類型的回調。 我已經啟動並運行了整個代碼。 但是,當我嘗試在回調中創建該類型的實例並應用where子句時,會遇到麻煩(請參見類TestOneCallbacks中的-> DataReaderToResultItemConverterCallback)。

where子句使之完美。 TResult將為TestOne ResultItem類型。 但是,我無法使用where子句來完成這項工作。 另外,直接創建TestTwo ResultItem [請參見->類TestTwoCallbacks]並進行強制轉換可以使其正常工作,但並不美觀。

這是TestOneCallbacks的以下錯誤,

在通用類型或方法“ DataAccess.TestOneCallbacks.DataReaderToResultItemConverterCallback(System.Data.IDataReader)”中,類型“ TResult”不能用作類型參數“ TResult”。 沒有從“ TResult”到“ Service.Interface.TestFilterResultItem”的裝箱轉換或類型參數轉換。

這是代碼。

public static class DBHelper
{
    public static List<TResult> ExecuteQuery<TResult>(DataQueryArgs<TResult> dataQueryArgs)
    {
        List<TResult> result = null;
        {
            IDataReader reader = null;

            //Get the input parameters for the query
            Dictionary<string, object> inputParameters = dataQueryArgs.InputParameters;

            //Fire callback to Get the DbCommand for the query
            DbCommand command = dataQueryArgs.GetCommandCallback();

            //Fire callback to Get the list of Sql input Parameters for the query
            List<SqlParameter> sqlParameters = dataQueryArgs.CreateSQLParametersCallback(inputParameters);

            //Execute the query and get an IDataReader object
            reader = ExecuteQuery(command, sqlParameters);

            //Fire callback Convert the IReader to ResultItem
            result = dataQueryArgs.DataReaderToResultItemConverterCallback(reader);
        }

        return result;
    }

    private static IDataReader ExecuteQuery(DbCommand command, List<SqlParameter> sqlParameters)
    {
        IDataReader reader = null;
        {
            //TODO:
        }

        return reader;
    }
}

class TestOneResultItem
{
    public TestOneResultItem()
    {
    }

    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime DOB { get; set; }
}

class TestTwoResultItem
{
    public TestTwoResultItem()
    {
    }

    public string Description { get; set; }
    public int Size { get; set; }
}

public class TestOneCallbacks
{
    public DataQueryArgs<TResult> InitializeDataQueryCallbacks<TResult>(Dictionary<string, object> dataQueryArgs_inputParameters)
    {
        DataQueryArgs<TResult> args = null;
        DataQueryArgs<TResult>.DataReaderToResultItemConverter<TResult> dataReaderToResultItemConverterCallback = this.DataReaderToResultItemConverterCallback<TResult>;
        args = new DataQueryArgs<TResult>(dataReaderToResultItemConverterCallback);

        return args;
    }

    public List<TResult> DataReaderToResultItemConverterCallback<TResult>(IDataReader reader) where TResult : TestOneResultItem
    {
        List<TResult> results = new List<TResult>();
        TResult t1 = new TResult();     //Activator.CreateInstance ???
        {
            t1.Name = "ShaQ";
            t1.Age = 99;
            t1.DOB = DateTime.Now;
        }
        results.Add(t1);
        return results;
    }
}

public class TestTwoCallbacks
{
    public DataQueryArgs<TResult> InitializeDataQueryCallbacks<TResult>(Dictionary<string, object> dataQueryArgs_inputParameters)
    {
        DataQueryArgs<TResult> args = null;
        DataQueryArgs<TResult>.DataReaderToResultItemConverter<TResult> dataReaderToResultItemConverterCallback = this.DataReaderToResultItemConverterCallback<TResult>;
        args = new DataQueryArgs<TResult>(dataReaderToResultItemConverterCallback);

        return args;
    }

    public List<TResult> DataReaderToResultItemConverterCallback<TResult>(IDataReader reader) where TResult : TestTwoResultItem
    {
        var results = new List<TestTwoResultItem>();
        TestTwoResultItem t1 = new TestTwoResultItem();     //Activator.CreateInstance ???
        {
            t1.Description = "This works...";
            t1.Size = 345;
        }
        results.Add(t1);
        return results as List<TestTwoResultItem>;      //Ugly, but I know exactly what I am doing. This cast will succeed!
    }
}

如果將TResult傳遞給該方法,則從調用方法派生的TResult應具有與被調用方法相同的類型約束。 因此,您必須將where TResult : TestOneResultItem的類型約束添加到調用方法: InitializeDataQueryCallbacks

public DataQueryArgs<TResult> InitializeDataQueryCallbacks<TResult>
       (Dictionary<string, object> dataQueryArgs_inputParameters)
       where TResult : TestOneResultItem

順便說一句,為了調用TResult構造函數,您需要new()約束:

       where TResult : TestOneResultItem, new()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM