2

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

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

我需要在一个单独的类中使用它,以便稍后进行 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”的函数发送一个字符串,并在各自的字典中返回一个对象,即(int、float 等)

4

2 回答 2

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;      
}
于 2014-06-24T01:30:50.947 回答
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"));


        }
于 2012-12-06T13:24:54.877 回答