1

次のように宣言された構造体があるとします。

public struct Test
{
    public static int Width = 5;
    ...
    public static int[] Value = new int[1]{ 0 };
}

今、私がやりたいのは、これを別の構造体の中から呼び出すことですが、その方法を手がかりにする必要があります。私がやろうとしていることは(私の心の中で)次のようになります:

public struct AnotherStruct
{
    public (type of struct) this[int key]
    {
        get
        {
            switch(key)
            {
                case 1:
                    return (another struct);
                default:
                    return null;
            }
        }
    }
}

私の最終目標は、オブジェクトのインスタンスを作成せずに、次のようなコードを使用することです。

structobject s = new AnotherStruct[5];

したがって、この「ルックアップテーブル」は別のプロジェクトで作成されてビルドされ、メインプロジェクトからdllとして呼び出されます。他の場所でdllをビルドして呼び出しているので、dllを一度メモリにロードして、メインプロジェクトからそのメモリを参照できるようにしたいと思っています。次に、メモリの割り当てられた部分が1つあり、コードはそれを参照するだけで、このルックアップテーブルの個々のインスタンスを作成する必要がなくなります(したがって、メモリの割り当てと新しいインスタンスの保存にかかる時間のオーバーヘッドが回避されます)。私が節約した時間は長期的には非常に有益であるため、これを何らかの形で機能させることができると期待しています。

これがあまり混乱しないことを願っていますが、説明が必要な場合はお知らせください。

編集 これはWebサイトで使用されているため、実際には、すべての接続にわたって存続し、コードが最初にロードされたときに1回作成されるオブジェクトが必要です。同じ考えですが、おそらくそれはより簡単な解決策になりますか?

4

3 に答える 3

0

解決策#1。すべての構造と辞書コレクションに共通のインターフェースを使用する

public interface IStr { }

public struct St1 : IStr
{
    public static int ID = 1;
}
public struct St2 : IStr
{
    public static int ID = 2;
}

public class StructFactory : System.Collections.ObjectModel.KeyedCollection<int, IStr>
{
    public static StructFactory Default = new StructFactory();
    protected override int GetKeyForItem(IStr item)
    {
        FieldInfo finfo = item.GetType().GetField("ID", 
            BindingFlags.Static | BindingFlags.Public);

        return (int)finfo.GetValue(item);
    }

    public StructFactory()
    {
        Add(new St1());
        Add(new St2());
    }
}

class Program
{
    static void Main(string[] args)
    {
        St1 x = (St1)StructFactory.Default[1];
        St2 y = (St2)StructFactory.Default[2];
    }
}
于 2011-05-08T03:07:17.723 に答える
0

上記で使用した構文は、「5つの要素を含むAnotherStructの配列を作成する」ことを意味するため機能しません。ただし、コメントで述べたように、ファクトリパターンの使用を検討する必要があります。

ただし、実際に上記のパターンを使用したい場合は、少し変更することができます。AnotherStruct配列に、各構造体のTypeインスタンスを保持させます。次に、「作成」行は次のようになります。

structobject s = (structobject)Activator.CreateInstance(AnotherStruct[5]);

アセンブリでリフレクションを使用して(DLLでラップしているため)、これらのTypeオブジェクトを取得できます。

そして最後に、使用する本当に正当な理由がない限りstruct(そして、いくつかあるニュアンスのすべてを理解している場合を除いて)、に固執しclassます。

于 2011-05-08T03:14:21.883 に答える
0

解決策#2。IDのアイデア全体を捨てて、構造型とジェネリックスだけを使用してください。

public struct St1 
{
}
public struct St2 
{
}

public class Factory<T>
    where T : struct
{
    static T _new = new T(); //cached copy of structure

    public static T New { get { return _new; } }        
}


class Program
{
    static void Main(string[] args)
    {
        St1 x1 = Factory<St1>.New;
        St1 x2 = Factory<St1>.New;
        St1 x3 = Factory<St1>.New;
        St2 y1 = Factory<St2>.New;
        St2 y2 = Factory<St2>.New;
    }
}
于 2011-05-08T03:18:32.363 に答える