我有一个泛型类,我把它的类型作为参数类型,例如int
我班上的方法如下:
public class UnlimitedGenericArray<T>
{
private void InsertItem(T item)
{
this.array[0] = item;
}
}
现在,当我想从控制台应用程序调用{{1}}时,我怎么能在运行时知道参数的类型?
InsertItem()
我可以改为编写 static void Main(string[] args)
{
UnlimitedGenericArray<int> oArray = new UnlimitedGenericArray<int>();
while(true)
{
var userInput = Console.Readline();
oArray.InsertItem(userInput);
}
}
,然后使用如下方法进行投射:
InsertItem(object item)
但这可能不是一个好习惯。我还需要知道客户端的参数类型,以便我可以在那里解析然后调用该方法。我是Generics的新手,所以请帮帮我。
答案 0 :(得分:10)
您不知道方法正文中的类型。如果您知道这种类型,那么您首先就不会使用泛型。
您可能不想在此处使用泛型。如果您需要根据类型做出决定,那么您的方法不是通用。
答案 1 :(得分:0)
当您将泛型参数指定为int时,您可以稍后假设该类型。因此,控制台应用程序中的代码变为:
static void Main(string[] args)
{
// Specifying int here ...
UnlimitedGenericArray<int> oArray = new UnlimitedGenericArray<int>();
while(true)
{
string userInput = Console.ReadLine();
int number = int.Parse(userInput);
// ... therefore we know that the method below requires an int
oArray.InsertItem(number);
}
}
答案 2 :(得分:0)
唯一想到的选择是将类从一种已知类型转换为Type / Func字典形式的方法,如下所示:
public class UnlimitedGenericArray<T>
{
public IList<T> List { get; set; }
private IDictionary<Type,Func<object,T>> InserterFuncDict{get;set;}
public UnlimitedGenericArray(IDictionary<Type,Func<object,T>> inserterDict)
{
this.List = new List<T>();
this.InserterFuncDict = inserterDict;
}
public void AddItem(object item)
{
var itemType = item.GetType();
if(itemType == typeof(T))
{
this.List.Add((T)item);
}
else if(this.InserterFuncDict.ContainsKey(itemType))
{
this.List.Add(this.InserterFuncDict[itemType](item));
}
else
{
var msg = "I don't know how to convert the value: {0} of type {1} into type {2}!";
var formatted = string.Format(msg,item,itemType,typeof(T));
throw new NotSupportedException(formatted);
}
}
}
然后用法如下:
var arr = new UnlimitedGenericArray<int>(new Dictionary<Type,Func<object,int>>()
{
{ typeof(string), v => int.Parse(v.ToString()) }
});
// ok! int == T
arr.AddItem(123);
// ok, a mapping is provided
arr.AddItem("123");
// Error!
//"I don't know how to convert the value: False of type System.Boolean into type System.Int32!"
arr.AddItem(false);
然后,如果说,您想添加布尔支持,您可以将声明更改为:
var arr = new UnlimitedGenericArray<int>(new Dictionary<Type,Func<object,int>>()
{
{ typeof(string), v => int.Parse(v.ToString()) }
{ typeof(bool), v => bool.Parse(v.ToString()) }
});
根据需要继续添加类型转换字典。