[英]C# Struct / Lookup Table
说我有一个声明如下的结构:
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。 对所有结构和词典集合使用通用接口
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];
}
}
您上面使用的语法不起作用,因为它的意思是“创建一个包含五个元素的AnotherStruct数组”。 但是,正如评论中提到的那样,您确实应该考虑使用工厂模式。
但是,如果您确实要使用上面的模式,则可以对其稍加更改。 让AnotherStruct数组保存每个结构的Type实例。 然后,您的“创建”行将更像:
structobject s = (structobject)Activator.CreateInstance(AnotherStruct[5]);
您可以在Assembly上使用反射(因为您将其包装在DLL中)来获取那些Type对象。
最后,除非您有充分的理由使用struct
(并了解所有细微差别,其中有许多细微差别),否则请坚持使用class
。
解决方案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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.