0

我有两节课:

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中,同时允许轻松访问/操作公共属性、类的方法。

我确实尝试添加一个 dummy interface,但它失去了与对象的关系,返回接口实例,因此阻止我使用那些公共属性、方法:

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 typeConsole.IConsoleProperty`(您是否缺少 using 指令或程序集引用?)

我读到我应该在这种情况下进行转换,但我不知道如何从字符串 ( typeof(variable.Value)) 动态转换,尤其是Generic对于多种类型的实例。

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

4

2 回答 2

2

首先,这些:

public string handle;
public string description;

不是公共属性,它们是公共字段。公共属性是这样完成的:

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

不过,请考虑您是否真的需要从课堂外更改这些内容。

但是,要回答您的问题,您的两个班级有一些共同点,但它们却大不相同。所以最干净的解决方案实际上是有两个字典。不要试图使两件事变得相同,而实际上并非如此。

您可以通过调用对象的GetType()方法来访问对象类型信息。T您可以通过执行检查它是否属于类型

if (myObj is T)

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

于 2013-05-25T00:20:07.960 回答
1

您可能希望在您的界面中包含handle和。这种方式 将返回一个包含和。然后你就可以使用and了。但是,如果您想使用非共享公共成员,则必须强制转换。descriptionIConsolePropertyvariable.ValueIConsolePropertyhandledescriptionhandledescription

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
}
于 2013-05-25T00:20:10.173 回答