我有两个班级:
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
实例。
如何将这两个类保留在一个目录中,但在检索值时,获取基类实例而不是接口?
答案 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
界面中加入description
和IConsoleProperty
。这条路
variable.Value
将返回IConsoleProperty
,其中包含handle
和description
。然后,您就可以使用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
}