相关疑难解决方法(0)

泛型不能推断第二个参数?

我注意到C#编译器没有推断出第二个泛型参数.
例:

C++模板代码:(我知道模板不像泛型那样工作)

class Test {
public:
template <class T,class V> 
    T test(V v) {
       //do something with v
       return T();
    }
};

int i = 0;
Test t = new Test();
double j = t.test<double>(i); //infers V as int
Run Code Online (Sandbox Code Playgroud)

模板(和泛型)不能推断返回类型,所以在C++中我给它第一个模板参数,第二个模板参数是从变量类型推断出来的.

现在,在C#中使用相同的示例:

class Test {
    public T test<T,V>(V v) where T: new() {
       //do something with v
       return new T();
    }
};

int i = 0;
Test t = new Test();
double j = t.test<double>(i); //Error Using the generic method …
Run Code Online (Sandbox Code Playgroud)

.net c# generics templates

19
推荐指数
2
解决办法
7276
查看次数

IQueryable <T>上的泛型扩展方法

我在IQueryable上编写了一个扩展方法,它返回相同类型的IQueryable,只是稍微过滤了一下.让我们说它是这样的:

public static IEnumerable<T> Foo<T>(this IEnumerable<T> source, int? howmany = null)
{
    if (howmany.HasValue)
        return source.Take(howmany.Value);
    return source;
}
Run Code Online (Sandbox Code Playgroud)

调用上面的方法很简单 someLinqResult.Foo(2)

我需要其他方法来返回其他泛型类的实例,但是需要其他基类(与T上面的源不同).所以,这里是代码,我们假设这个方法应该返回给定类型的列表(除了IQueryable所具有的输入类型!)但长度相同[实际问题是关于转换NHibernate查询结果,但它没有物):

public static List<TTarget> Bar<TTarget,TSource>(this IEnumerable<TSource> source)
{
    return new List<TTarget>(source.Count());
}
Run Code Online (Sandbox Code Playgroud)

现在,鉴于strLinqResultIQueryable<string>,我需要称之为strLinqResult.Bar<int,string>();.

关键是我必须传递这两种类型,即使第一种已经知道我正在调用已定义的方法IQuerable.

因为它足以调用Foo(2)不是 Foo<string>(2)我认为编译器能够自动"传递/猜测"类型.

那么为什么我需要调用第二种方法Bar<int,string>();而不仅仅是Bar<int>()


实际代码:

    public static ListResponse<TResponse> 
        BuildListResponse<T,TResponse>(this IQueryable<T> iq, ListRequest request)
        where TResponse: new()
    {
        var result = iq.ApplyListRequestParams(request).ToList().ConvertAll(x => …
Run Code Online (Sandbox Code Playgroud)

c# generics extension-methods

6
推荐指数
1
解决办法
965
查看次数

如何将2个泛型类型传递给扩展方法

我创建了以下扩展方法

public static T Map<TEntity,T>(this TEntity entity) where TEntity : IEntity
{
    return Mapper.Map<TEntity, T>(entity);        
}
Run Code Online (Sandbox Code Playgroud)

这允许以下内容

Db.ExchangeSets.FirstOrDefault().Map<ExchangeSet, ExchangeSetSimpleViewModel>()
Run Code Online (Sandbox Code Playgroud)

但是我想知道无论如何我可以修改扩展方法,所以我可以调用如下的短路版本

Db.ExchangeSets.FirstOrDefault().Map<ExchangeSetSimpleViewModel>()
Run Code Online (Sandbox Code Playgroud)

请注意 :

是否应该像这样使用automapper不在问题的范围内,它更像是一个事实发现任务


更新

对于那些在家里玩的人,在scotts评论的帮助下,我设法找到一个额外的解决上述功能的通用扩展方法为automapper

public static T Map<T>(this IEntity entity) 
{
    return (T)Mapper.Map(entity, entity.GetType(), typeof(T));  
}
Run Code Online (Sandbox Code Playgroud)

但是除了AutoMapper之外,这不是实际问题的答案,而是相应地标记优点

c# generics extension-methods

6
推荐指数
1
解决办法
1984
查看次数

根据函数的表达式参数推断第二个泛型参数

此问题是部分类型推断的扩展 如果无法进行部分类型推断,那么有人可以解释OrderByDescending扩展方法是如何工作的吗?请注意,当我调用OrderByDescending(m => m.DateProp)时,我不会被要求提供Type参数.

static IOrderedQueryable<TSource> OrderByDescending<TSource, TKey>(
   this IQueryable<TSource> source, 
   Expression<Func<TSource, TKey>> keySelector);
Run Code Online (Sandbox Code Playgroud)

c# generics

4
推荐指数
1
解决办法
280
查看次数

标签 统计

c# ×4

generics ×4

extension-methods ×2

.net ×1

templates ×1