在一个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
实例。
如何将这两个类保持在一个目录中,但在值检索时,获得基类实例而不是接口?
首先,这些
public string handle;
public string description;
不是公共属性,它们是公共字段。公共属性是这样做的:
public string Handle { get; set; }
public string Description { get; set; }
如果你真的需要从类外改变这些,请考虑一下。
回答你的问题,虽然你的两个类有一些共同的特点,但它们是完全不同的。所以最简洁的解决方案就是有两个字典。不要试图把根本不一样的两件事弄得一样。
可以通过调用对象的GetType()
方法来访问对象的类型信息。您可以执行
T
类型。if (myObj is T)
但是没有办法把某件事归结为"不管它到底是什么"。
您可能希望在IConsoleProperty
接口中包含handle
和description
。这种方式variable.Value
将返回包含handle
和description
的IConsoleProperty
。然后您将能够使用handle
和description
。但是,如果您想使用非共享的公共成员,则必须强制转换。
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
}