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

本文关键字:许执行 执行 存储 一个 Dictionary | 更新日期: 2023-09-27 18:15:10

我有两个类:

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);

这些类代表一个Video Games, Console组件属性。

我想做的是,保持这两个在一个Directory,但允许容易地访问/操纵公共属性,类的方法。

我确实尝试添加一个虚拟的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 type Console。可以找到IConsoleProperty '(您是否缺少using指令或程序集引用?)

我读到我应该在这种情况下强制转换,但我不知道如何从字符串(typeof(variable.Value))动态强制转换,特别是与多个类型的Generic实例。

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

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

首先,这些

public string handle;
public string description;

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

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

如果你真的需要从类外改变这些,请考虑一下。

回答你的问题,虽然你的两个类有一些共同的特点,但它们是完全不同的。所以最简洁的解决方案就是有两个字典。不要试图把根本不一样的两件事弄得一样。

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

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

但是没有办法把某件事归结为"不管它到底是什么"。

您可能希望在IConsoleProperty接口中包含handledescription。这种方式variable.Value将返回包含handledescriptionIConsoleProperty。然后您将能够使用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
}