微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

转换C#方法以使用引用内部属性的泛型

我想转换一个方法来使用泛型.
它目前硬编码为以下类型:

> DataContext.Document在数据上下文的部分类中并从对象继承
> DataContext.Documents也在这个部分类中继承自Linq.Table< Document>
> Import.Document继承自定义类ImportObject

原始方法

public void ProcessDocuments(Delegate method,params object[] args)
{
    using (DataContext dc = new DataContext())
    {
        dc.ObjectTrackingEnabled = false;

        // Map from DataContext object to ImportObject
        Mapper.CreateMap<Document,Import.Document>();

        // Loop through DataContext objects
        foreach (Document d in dc.Documents)
        {
            Import.Document doc = Mapper.Map<Document,Import.Document>(d);
            args[0] = doc;
            method.DynamicInvoke(args);
        }
    }
}

尝试方法

public void ProcessImportObjects<TSource,TDestination>
    (Action<TDestination,ImportDataSource,int> processMethod,ImportDataSource importSource,int resultId)
{
    using (DataContext dc = new DataContext())
    {
        dc.ObjectTrackingEnabled = false;
        Mapper.CreateMap<TSource,TDestination>();

        foreach (TSource d in dc.Documents) // PROBLEM: Hard-coded reference to property on DataContext
        {
            TDestination doc = Mapper.Map<TSource,TDestination>(d);
            processMethod(doc,importSource,resultId);
        }
    }
}

(这里,TDestination应该是ImportObject类型,但我不知道如何表达它.)

如注释中所示,foreach需要引用DataContext上的属性,该属性是IEnumerable< TSource>.
这是否意味着我需要将DataContext作为参数传递或是否有更好的方法

解决方法

听起来你需要在DataContext中参数化属性名称.一种方法是传入一个函数,它接受一个DataContext并返回你的枚举(一个Func< DataContext,IEnumerable< TSource>>),然后你传入一个像dc =>这样的lambda. dc.Document作为该参数.

一个可行(但没有类型安全性)的选项是将属性名称作为字符串传递,然后使用Reflection来访问它.

public void ProcessImportObjects<TSource,TDestination>
    (Func<DataContext,IEnumerable<TSource>> dcProperty,Action<TDestination,TDestination>();

        foreach (TSource d in dcProperty(dc))
        {
            TDestination doc = Mapper.Map<TSource,resultId);
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐