使用泛型类型&#39; Mapper <t>&#39;需要1个类型参数

时间:2016-06-10 10:41:41

标签: c#

我有以下课程:

public class Mapper<T> {

  public static Mapper<T> GetFor<TKey>(T type) {
    return new Mapper<T>();
  }

  public static Mapper<T> GetFor<TKey>(IEnumerable<T> types) {
    return new Mapper<T>();
  }  

  public Mapper<T> Add<TKey>(Expression<Func<T, TKey>> expression, String name) {

    _fields.Add(name, expression);
    return this;

  }

}

我正在使用静态方法,因为有时我需要创建一个具有匿名类型的Mapper实例,所以我使用:

var a = new { /* ... */ }
var b = Mapper.GetFor(a);

但我收到错误:

Using the generic type 'Mapper<T>' requires 1 type arguments

我也尝试了以下内容:

public class MapperFactory {
  public static Mapper<T> CreateMapperFor<T>(IEnumerable<T> typeProvider) {
    return new Mapper<T>();
  }
}

var a = new { /* ... */ }
var b = MapperFactory.CreateMapperFor(a);

使用工厂类可以正常工作......

  1. 如何解决第一个版本的问题?
  2. 我应该在Mapper中使用方法还是使用工厂?
  3. 我这样做只是因为我有类型是匿名的情况。

3 个答案:

答案 0 :(得分:2)

  

如何解决第一个版本的问题?

你不是。要在泛型类中调用静态方法,需要指定泛型类型参数。

  

我应该在Mapper中使用方法还是使用工厂?

使用非通用工厂类。如果需要,您只需致电您的工厂类Mapper即可。这就是.NET框架的作用:

  • Tuple<T1, T2>是一个通用类。
  • Tuple是包含static factory method Create<T1, T2>(T1 item1, T2 item2)
  • 的工厂类

答案 1 :(得分:2)

没有<div id="dd" class="wrapper-dropdown-2">Sign in with <ul class="dropdown"> <li><a href="#"><i class="icon-twitter icon-large"></i>Twitter</a></li> <li><a href="#"><i class="icon-github icon-large"></i>Github</a></li> <li><a href="#"><i class="icon-facebook icon-large"></i>Facebook</a></li> </ul> 这样的类,只有Mapper,所以你不能在这样一个不存在的类上调用静态方法(即{{1}没有解决)。

您需要为此创建一个非泛型辅助类:

Mapper<T>

所以现在你可以:

Mapper.GetFor

答案 2 :(得分:0)

@Heinzi是对的,你不能这样做,最好使用在非泛型类中声明的工厂方法。如果您真的想将-i and -u用作Mapper(虽然我不认为这是一个好习惯),您可以定义TypeName并在那里声明方法

static class Mapper