在一个Dictionary中存储不同的类,允许执行

时间:2013-05-24 23:56:47

标签: c# dictionary

我有两个班级:

public class Variable<T>;
public class Closure;

两者共享这些属性:

public string handle;
public string description;

两者都有名为GetValue的方法:

public T GetValue(); // Variable<T>
public string GetValue(params string[] arguments); // Closure

Variable<T>有一个额外的方法SetValue

public string SetValue(object newValue);

这些类代表视频游戏,控制台组件属性。

我想要做的是,将这两者保持在一个Directory内,但允许轻松访问/操纵公共属性,类方法。

我确实尝试添加一个虚拟interface,但是丢失了与object的关系,返回了接口实例,因此阻止我使用那些公共属性,方法:

public static class Storage
{
    public static Dictionary<string, IConsoleProperty> Variables = new Dictionary<string, IConsoleProperty>();

    public static string Inform()
    {
        string output = "";

        foreach (var variable in Variables)
        {
            output += string.Format("{0} : {1}", variable.Key, variable.Value.description);
        }

        return output;
    }
}
  

类型Console.IConsoleProperty不包含description的定义,也没有扩展方法description' of type可以找到Console.IConsoleProperty`(您是否缺少using指令或程序集引用?)< / p>

我读到我应该投射这样的场景,但我不知道如何从字符串(typeof(variable.Value))动态投射,尤其是多种类型的Generic实例。

如何将这两个类保留在一个目录中,但在检索值时,获取基类实例而不是接口?

2 个答案:

答案 0 :(得分:2)

首先,这些:

public string handle;
public string description;

不是公共属性,它们是公共字段。公共属性如下所示:

public string Handle { get; set; }
public string Description { get; set; }

考虑一下你是否真的需要从课外改变这些。

要回答你的问题,你的两个班级有一些共同点,但它们完全不同。因此,最干净的解决方案实际上是有两个字典。不要试图让两件事情真的不相同。

您可以通过调用GetType()方法来访问对象类型信息。您可以通过执行

检查它是否为T类型
if (myObj is T)

但是没有办法将某些东西归结为“无论它究竟是什么”。

答案 1 :(得分:1)

您可能希望在handle界面中加入descriptionIConsoleProperty。这条路 variable.Value将返回IConsoleProperty,其中包含handledescription。然后,您就可以使用handledescription。但是,如果您想使用非共享公共成员,则必须进行强制转换。

public interface IConsoleProperty 
{
    public string handle { get; set; }
    public string description { get; set; }
}

public class Variable<T> : IConsoleProperty
{
    public string handle { get; set; }
    public string description { get; set; }
    //Rest of Variable class
}
public class Closure : IConsoleProperty
{
    public string handle { get; set; }
    public string description { get; set; }
    //Rest of Closure class
}

如果你需要做一些演员表,你可以这样做:

if (variable.Value is Closure)
{
    var myClosure = (Closure)variable.Value;
    //Do stuff with myClosure
}
//Susbstitute MyOtherClass with the appropriate type argument
if (variable.Value is Variable<MyOtherClass>) 
{
    var myVariable = (Variable<MyOtherClass>)variable.Value;
    //Do stuff with myVariable
}