我有以下课程:
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);
使用工厂类可以正常工作......
我这样做只是因为我有类型是匿名的情况。
答案 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