问题描述
我正在尝试通过以下两种方法重构
方法1
public void DoSomething(Bus a,string str)
{
var temp = new List<Bus>();
...
}
方法2
public void DoSomething(Car a,string str)
{
var temp = new List<Car>();
...
}
以下操作无效,并给出“ a是变量,但像类型一样使用” 错误。除此之外,我什至无法想象如何调用此方法/在第一个参数中输入什么。
public void DoSomething<T>(T a,string str)
{
var temp = new List<a>();
...
}
DoSomething<Bus>(Bus,"str");
DoSomething<Car>(Car,"str");
- 其他帖子建议使用
MakeGenericmethod
。这是唯一的方法吗? Use variable as Type - 如果我希望这些方法返回
List<T>
(汽车/公交车)而不是void
,那么如何将#1解决方案与泛型一起使用?
更新 正如我在评论中留下的-> @ChetanRanpariya,那么如何调用此方法? DoSomething(?,?);
解决方法
您使用了a
(实例)而不是实际的类型T
public void DoSomething<T>(T a,string str)
{
var temp = new List<T>(); // you need to use T here,it's the actual type
}
...
DoSomething<Bus>(myBus,"str");
DoSomething<Car>(myCar,"str");
其他资源
Generics (C# Programming Guide)
更新
41686d6564提出了一个有趣的观点
很难说出您是否实际上是在尝试将类型传递给Methods参数:
DoSomething<Bus>(whatYouPassInHereWouldNeedToBeAnInstanceNotAtype,"str");`
如果您不需要使用实例,则无需传递实例。只需使用通用参数
public void DoSomething<T>(string str)
...
DoSomething<Bus>("str");
,
似乎您输入有误,或者列表定义不正确
public void DoSomething<T>(T a,string str)
{
// Incorrect
var temp = new List<a>();
// Correct
var temp = new List<T>();
// ...
}
DoSomething<Bus>(Bus,"str");
DoSomething<Car>(Car,"str");
也许这有帮助...