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クラスを使用してコンテンツを解析できますが、転送中に何かが失われることを望まないため、このメソッドの使用にうんざりしています。

私の質問は、そのような関数でシリアル化に使用しているクラス内の特定のタイプの異なるオブジェクトの1つを返す方法です

前の関数を使用してクラス内のコンテンツを取得したい場合、たとえば

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など)を返します。

4

2 に答える 2

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 に答える
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 に答える