如何创建一个泛型方法来返回调用指定的特定类型?

Edw*_*uay 5 c# generics

以下代码给出了错误:

Cannot implicitly convert type T to string.
Cannot implicitly convert type T to int.
Run Code Online (Sandbox Code Playgroud)

当我调用它时,我该怎么做才能让这个方法返回我用T定义的变量类型?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestGener234
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("his first name is {0}", GetPropertyValue<string>("firstName"));
            Console.WriteLine("his age is {0}", GetPropertyValue<int>("age"));
        }

        public static T GetPropertyValue<T>(string propertyIdCode)
        {
            if (propertyIdCode == "firstName")
                return "Jim";
            if (propertyIdCode == "age")
                return 32;
            return null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

附录:

这是一个更完整的例子,说明为什么我需要通用解决方案,即我有一个类,无论类型如何都将其值保存为字符串,这种通用解决方案只是使调用代码更清晰:

using System;
using System.Collections.Generic;

namespace TestGener234
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Item> items = Item.GetItems();
            foreach (var item in items)
            {
                string firstName = item.GetPropertyValue<string>("firstName");
                int age = item.GetPropertyValue<int>("age");
                Console.WriteLine("First name is {0} and age is {1}.", firstName, age);
            }
            Console.ReadLine();
        }
    }

    public class Item
    {
        public string FirstName { get; set; }
        public string Age { get; set; }


        public static List<Item> GetItems()
        {
            List<Item> items = new List<Item>();
            items.Add(new Item { FirstName = "Jim", Age = "34" });
            items.Add(new Item { FirstName = "Angie", Age = "32" });
            return items;
        }

        public T GetPropertyValue<T>(string propertyIdCode)
        {
            if (propertyIdCode == "firstName")
                return (T)(object)FirstName;
            if (propertyIdCode == "age")
                return (T)(object)(Convert.ToInt32(Age));
            return default(T);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 13

这很麻烦; 为了使编译器满意,你可以进行双重转换,但这意味着值类型的框:

    public static T GetPropertyValue<T>(string propertyIdCode)
    {
        if (propertyIdCode == "firstName")
            return (T)(object)"Jim";
        if (propertyIdCode == "age")
            return (T)(object)32;
        return default(T);
    }
Run Code Online (Sandbox Code Playgroud)

实际上,我认为使用object返回类型可能会更好.

  • @Benjamin:我喜欢这个"你使用泛型的方式只是一种幻想的方式":-) (3认同)
  • 是的,但是 - 你是以一种奇怪的方式使用它.您的方法根据参数的_content_决定返回的类型.你使用泛型的方式只是一种奇特的方式来投射,真的.如果你使用GetPropertyValue <string>(或(字符串)GetPropertyValue(不改变你作为调用者的事实,_have_知道返回类型并明确指定它.你什么都不赢,imo. (2认同)