C# 有人能解释一下这个委托语法吗?

C# 有人能解释一下这个委托语法吗?,c#,C#,在名为DataAccess的类库中,我发现以下声明和用法: public static class DataAccess { public delegate T LoadObject<T>(SqlDataReader dataReader); public static Dictionary<TKey, TValue> GetDictionaryFromReader<TKey, TValue>( Database databa

在名为DataAccess的类库中,我发现以下声明和用法:

public static class DataAccess
{
    public delegate T LoadObject<T>(SqlDataReader dataReader);

    public static Dictionary<TKey, TValue> GetDictionaryFromReader<TKey, TValue>(
        Database database
        , DbCommand dbCommand
        , LoadObject<KeyValuePair<TKey, TValue>> loadMethod
        )
    {
        Dictionary<TKey, TValue> _dictionary = new Dictionary<TKey, TValue>();

        using (SqlDataReader dataReader = StoredProcedures.ExecuteSqlDataReader(database, dbCommand))
        {
            GenerateDictionary<TKey, TValue>(dataReader, ref _dictionary, loadMethod);
        }

        return _dictionary;
    }
}
公共静态类数据访问
{
公共委托T LoadObject(SqlDataReader);
公共静态字典GetDictionaryFromReader(
数据库
,DbCommand DbCommand
,LoadObject loadMethod
)
{
字典_Dictionary=新字典();
使用(SqlDataReader dataReader=storedprocesdures.ExecuteSqlDataReader(数据库,dbCommand))
{
GenerateDictionary(数据阅读器、参考字典、加载方法);
}
返回字典;
}
}
此静态方法调用上面的GetDictionaryFromReader:

public static Dictionary<String, String> GetGroupTypesList()
{
    Dictionary<string, string> dict = new Dictionary<string, string>();

    Database database = CenestDatabaseFactory.CreateDatabase();

    DbCommand dbCommand = database.GetStoredProcCommand(SP_LIST_GROUP_TYPES);

    dict = DataAccess.GetDictionaryFromReader<string, string>(database, dbCommand, _loadGroupType);

    return dict;
}
private static KeyValuePair<string, string> _loadGroupType(SqlDataReader returnData)
{
    KeyValuePair<string, string> entry =
        new KeyValuePair<string, string>((string)returnData["Group_Type"], (string)returnData["Group_Type_Desc"]);

    return entry;
}
公共静态字典GetGroupTypesList()
{
Dictionary dict=新字典();
Database=CenestDatabaseFactory.CreateDatabase();
DbCommand DbCommand=database.GetStoredProcCommand(SP\u列表\u组\u类型);
dict=DataAccess.GetDictionaryFromReader(数据库,dbCommand,_loadGroupType);
返回命令;
}
它将“\u loadGroupType”传递到“loadMethod”。“\u loadGroupType”如下所示:

public static Dictionary<String, String> GetGroupTypesList()
{
    Dictionary<string, string> dict = new Dictionary<string, string>();

    Database database = CenestDatabaseFactory.CreateDatabase();

    DbCommand dbCommand = database.GetStoredProcCommand(SP_LIST_GROUP_TYPES);

    dict = DataAccess.GetDictionaryFromReader<string, string>(database, dbCommand, _loadGroupType);

    return dict;
}
private static KeyValuePair<string, string> _loadGroupType(SqlDataReader returnData)
{
    KeyValuePair<string, string> entry =
        new KeyValuePair<string, string>((string)returnData["Group_Type"], (string)returnData["Group_Type_Desc"]);

    return entry;
}
private static KeyValuePair\u loadGroupType(SqlDataReader returnData)
{
KeyValuePair条目=
新的KeyValuePair((string)returnData[“Group_Type”],(string)returnData[“Group_Type_Desc”]);
返回条目;
}
我有点“得到”\u loadGroupType方法作为参数传递到GetDictionaryFromReader中。好吧,但为什么?这个委托声明语法应该说什么

public delegate T LoadObject<T>(SqlDataReader dataReader);
公共委托T LoadObject(SqlDataReader-dataReader);
我真的很想知道这是怎么回事。你不需要自己解释,但你能指出一些能让我明白的东西吗

谢谢

对@ReedCopsey的补充说明:

public static Dictionary<String, String> GetGroupTypesList()
{
    Dictionary<string, string> dict = new Dictionary<string, string>();

    Database database = CenestDatabaseFactory.CreateDatabase();

    DbCommand dbCommand = database.GetStoredProcCommand(SP_LIST_GROUP_TYPES);

    dict = DataAccess.GetDictionaryFromReader<string, string>(database, dbCommand, _loadGroupType);

    return dict;
}
private static KeyValuePair<string, string> _loadGroupType(SqlDataReader returnData)
{
    KeyValuePair<string, string> entry =
        new KeyValuePair<string, string>((string)returnData["Group_Type"], (string)returnData["Group_Type_Desc"]);

    return entry;
}
所以

在本使用声明中:

using (SqlDataReader dataReader = StoredProcedures.ExecuteSqlDataReader(database, dbCommand))
{
    GenerateDictionary<TKey, TValue>(dataReader, ref _dictionary, loadMethod);
}
使用(SqlDataReader-dataReader=storedprocess.ExecuteSqlDataReader(数据库,dbCommand))
{
GenerateDictionary(数据阅读器、参考字典、加载方法);
}
C#是否足够聪明,能够识别loadMethod需要传递给它的SqlDataReader,并且能够这样做——因为using语句和初始委托声明?因为否则,我看不到数据读取器是如何将其放入方法的

当然不是!根据@ReedCopsey,GenerateDictionary方法使用SqlDataReader,Duh:

private static void GenerateDictionary<TKey, TValue>(
    SqlDataReader dataReader
    , ref Dictionary<TKey, TValue> dictionary
    , LoadObject<KeyValuePair<TKey, TValue>> loadMethod
    )
{
    while (dataReader.Read())
    {
        KeyValuePair<TKey, TValue> kvp = loadMethod(dataReader);
        dictionary.Add(kvp.Key, kvp.Value);
    }
}
private static void GenerateDictionary(
SqlDataReader数据读取器
,参考字典
,LoadObject loadMethod
)
{
while(dataReader.Read())
{
KeyValuePair kvp=loadMethod(数据读取器);
添加(kvp.Key,kvp.Value);
}
}
这个委托声明语法应该说什么

public delegate T LoadObject<T>(SqlDataReader dataReader);
这是一个委托,其类型是一个方法,该方法接受
SqlDataReader
作为输入,并返回一个泛型类型
T

在您的情况下,
T
结果是
KeyValuePair


C#是否足够聪明,能够识别loadMethod需要传递给它的SqlDataReader,并且能够这样做——因为using语句和初始委托声明?因为否则,我看不到数据读取器是如何将其放入方法的

否。
GenerateDictionary
方法将使用传递给它的
dataReader
调用委托

这个委托声明语法应该说什么

public delegate T LoadObject<T>(SqlDataReader dataReader);
这是一个委托,其类型是一个方法,该方法接受
SqlDataReader
作为输入,并返回一个泛型类型
T

在您的情况下,
T
结果是
KeyValuePair


C#是否足够聪明,能够识别loadMethod需要传递给它的SqlDataReader,并且能够这样做——因为using语句和初始委托声明?因为否则,我看不到数据读取器是如何将其放入方法的


否。
generatedecationary
方法将使用传递给它的
dataReader
调用委托。

声明
公共委托T LoadObject(SqlDataReader dataReader)
需要一个
SqlDataReader
,并将返回您想要的任何类型。可以是
int
列表
甚至是另一个代理。这是因为在类型
T
上没有标记,它只与委托的返回类型相关联

另一方面,我们有
private static KeyValuePair\u loadGroupType(SqlDataReader returnData)
。这是一个函数,它接收一个
SqlDataReader
,并返回一个。。。等等,没关系,什么都可以!因此,
\u loadGroupType
确实与具有
T
=
KeyValuePair
的委托
LoadObject
匹配,并且可以隐式使用


如果声明了委托,例如
委托KeyValuePair D2(SqlDataReader)它也会匹配,但这次没有泛型。当类型与操作无关(或者可以是约束类型)时,泛型是您的朋友。

声明
公共委托t LoadObject(SqlDataReader dataReader)
需要一个
SqlDataReader
,并将返回您想要的任何类型。可以是
int
列表
甚至是另一个代理。这是因为在类型
T
上没有标记,它只与委托的返回类型相关联

另一方面,我们有
private static KeyValuePair\u loadGroupType(SqlDataReader returnData)
。这是一个函数,它接收一个
SqlDataReader
,并返回一个。。。等等,没关系,什么都可以!因此
\u loadGroupType
与委托
LoadObj“匹配”