Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Func、Action和泛型进行不明确的属性赋值_C#_Generics - Fatal编程技术网

C# 使用Func、Action和泛型进行不明确的属性赋值

C# 使用Func、Action和泛型进行不明确的属性赋值,c#,generics,C#,Generics,我正在通过SqlDataReader循环,并设置对象的属性。我正在做大量重复性工作,我想知道这是否是使用4.0委托框架和泛型的好地方。我对框架实体、MVC等不感兴趣,这是黑盒子 ConvertReaderToMyCustomType是我当前的方法,关联的扩展方法是HasColumn 此外,如果tracking.PropertyX是日期时间呢?如果存在不同类型的多个属性,如何以通用方式处理强制转换?我知道你说过你对框架不感兴趣,但Dapper做到了这一点,而且如果你想查看代码,它是开源的。我仔细查

我正在通过SqlDataReader循环,并设置对象的属性。我正在做大量重复性工作,我想知道这是否是使用4.0委托框架和泛型的好地方。我对框架实体、MVC等不感兴趣,这是黑盒子

ConvertReaderToMyCustomType是我当前的方法,关联的扩展方法是HasColumn


此外,如果tracking.PropertyX是日期时间呢?如果存在不同类型的多个属性,如何以通用方式处理强制转换?

我知道你说过你对框架不感兴趣,但Dapper做到了这一点,而且如果你想查看代码,它是开源的。我仔细查看了它,它太膨胀了。我正在寻找一个“少即是多”的解决方案。我不确定你在哪里寻找Func或Action来发挥作用,你应该能够通过使你的转换方法成为一个通用方法并使用反射来完成你想要的。你能提供一个例子吗?@user3010406这很有趣,因为Dapper是ORMs的“少即是多”。您的代码要么特定于您的实体,要么最终得到类似于Dapper的东西。现在,如果这是为了学习如何做到这一点,那么一定要让自己出局,但如果这是为了其他人必须帮助维护的生产代码,并且有一个最后期限,那么为什么要重新发明轮子呢?
public static List<MyCustomType> ConvertReaderToMyCustomType(this SqlDataReader reader)
{
    var tempCollection = new List<MyCustomType>();
    int colX = reader.GetOrdinal("PropertyX");        
    while (reader.Read())
    {
        MyCustomType tracking = new MyCustomType();
        if (reader.HasColumn("PropertyX"))
        {
            tracking.PropertyX = reader[colX];
            //etc.
        }
    }
}

public static bool HasColumn(this IDataRecord dr, string columnName)
{
    for (int i = 0; i < dr.FieldCount; i++)
    {
        if (dr.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase))
            return true;
    }
    return false;
}