在一个函数C#中返回不同的类型

时间:2012-12-06 12:40:33

标签: c# generics types return-type

我正在创建一个项目数据管道,我需要从单个类中返回不同的类型

在这个类中,我有许多字典,用于保存和分离我想要加载的元素/内容,但我需要一种方法用单个字符串返回它们...因为我不熟悉这些类型函数我迷失了如何正确地返回内容

我需要在一个单独的类中,所以我可以稍后进行XML序列化

这是我现在拥有的

DataClass contents;
public T ReturnType<T>(string asset)
{
    if(typeof(T) == typeof(int))
    {
        return contents.Integers[Asset];
    }
    if(typeof(T) == typeof(float))
    {
        return contents.Floats[Asset];
    }
    if(typeof(T) == typeof(double))
    {
        return contents.Doubles[Asset];
    }
    return default(T);
}

它将允许我使用基础Object类来解析内容,但我不希望在传输过程中丢失任何东西,所以我厌倦了使用这种方法

我的问题是如何在类中使用类似函数返回某个类型的某个类型的不同对象之一

如果我想使用上一个函数来获取类中的内容,例如

public Object someobject;
//button event handler to change the current object
//preferably this would be changed depending on the object i would be calling
//but this should do for showing how it is supposed to work
public void ChangeCurrentObject(event e)
{
    someobject = (Object)ReturnType<Object>("23rdObject");
}

它向名为'ReturnType'的函数发送一个字符串,并在各自的字典中返回一个对象ie(int,float等)

2 个答案:

答案 0 :(得分:0)

此案例中的泛型只会帮助您不为每种资产类型编写不同的方法。您也可以使用此方法使其更加模块化。

     static  class Assets
    {
        public interface IAssetHandler<out T> 
        {
            T GetAsset(string name);
        }

        private static readonly Dictionary<Type,object> _handlers=new Dictionary<Type, object>();

        public static T GetAsset<T>(string name)
        {

            object assetHandler;

            if(!_handlers.TryGetValue(typeof(T),out assetHandler))
            {
              throw  new Exception("No handler for that type of asset");
            }

            return (assetHandler as IAssetHandler<T>).GetAsset(name);

        }


        public static void RegisterAssetHandler<T>(IAssetHandler<T> handler)
        {
            _handlers[typeof (T)] = handler;
        }

    }


 public class IntAssetsHandler:Assets.IAssetHandler<int>
        {
            #region Implementation of IAssetHandler<out int>

            public int GetAsset(string name)
            {
                return 0;
            }

            #endregion
        }





        static void Main(string[] args)
        {
            Assets.RegisterAssetHandler(new IntAssetsHandler());

            Console.WriteLine(Assets.GetAsset<int>("test"));


        }

答案 1 :(得分:0)

您可以使用外部类,根据需要设置属性类型,然后在函数中使用它。

public class MultipleOpjects
{
    public List<string> ObjectOne { get; set; }

    public List<object> ObjectTwo { get; set; }

    public object ObjectThree { get; set; }

}
public MultipleOpjects GetAnything()
{
    MultipleOpjects Vrble = new MultipleOpjects();
    Vrble.ObjectOne  = SomeThing1;
    Vrble.ObjectTwo = SomeThing2;
    Vrble.ObjectThree = SomeThing3;

    return Vrble;      
}