使用泛型参数调用方法

时间:2013-07-30 21:20:12

标签: c# generics

我有一个泛型类,我把它的类型作为参数类型,例如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的新手,所以请帮帮我。

3 个答案:

答案 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()) }
});

根据需要继续添加类型转换字典。