假设我的结构声明如下:
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加载到内存中一次,然后我可以从我的主项目中引用该内存。然后我将有一个已分配的内存部分,我的代码将只引用它,从而无需创建此查找表的单个实例(从而避免分配内存和存储新实例所需的时间开销)。从长远来看,我节省的时间将非常有益,所以我希望我能以某种方式让它工作。
我希望这不会太混乱,但如果需要澄清,请告诉我。
修改的 这是在网站上使用的,所以我真的需要一个在所有连接中持久化的对象,并在最初加载代码时创建一次。同样的想法,但也许这将成为一个更简单的解决方案?
答案 0 :(得分: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];
}
}
答案 1 :(得分:0)
上面使用的语法不起作用,因为它意味着“创建一个包含五个元素的AnotherStruct数组”。但是,正如评论中所提到的,你真的应该考虑使用工厂模式。
但是,如果你真的想使用上面的模式,你可以稍微改变一下。让您的AnotherStruct数组保存每个结构的Type实例。然后,您的“创建”行看起来更像:
structobject s = (structobject)Activator.CreateInstance(AnotherStruct[5]);
你可以在Assembly上使用反射(因为你将它包装在DLL中)来获取那些Type对象。
最后,除非你有充分的理由使用struct
(并了解所有细微差别,其中有几个),坚持使用class
。
答案 2 :(得分: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;
}
}