我有支持不同类型的列表下面的代码:避免使用泛型投和自定义数据的列表
public enum eType
{
tInt,
tString,
tDateTime
}
public interface ICustomType<out T>
{
T Value { get; }
}
public abstract class DifferentType
{
protected DifferentType(eType type, string mnemonic)
{
Type = type;
Mnemonic = mnemonic;
}
public string Mnemonic { get; private set; }
public eType Type { get; private set; }
}
public class DateTimeType : DifferentType, ICustomType<DateTime>
{
public DateTimeType(DateTime value, string mnemonic)
: base(eType.tDateTime, mnemonic)
{
Value = value;
}
public DateTime Value { get; private set; }
}
public class IntType : DifferentType, ICustomType<int>
{
public IntType(int value, string mnemonic)
: base(eType.tInt, mnemonic)
{
Value = value;
}
public int Value { get; private set; }
}
public class StringType : DifferentType, ICustomType<string>
{
public StringType(string value, string mnemonic)
: base(eType.tString, mnemonic)
{
Value = value;
}
public string Value { get; private set; }
}
public static class UtilValue
{
public static T GetValue<T>(DifferentType customType)
{
return ((ICustomType<T>)customType).Value;
}
}
public class testTypes2
{
public testTypes2()
{
var values = new List<DifferentType> { GetInt(), GetString(), GetDate() };
foreach (var i in values)
{
switch (i.Type)
{
case eType.tInt:
int resInt = UtilValue.GetValue<int>(i);
break;
case eType.tString:
string resString = UtilValue.GetValue<string>(i);
break;
case eType.tDateTime:
DateTime resDateTime = UtilValue.GetValue<DateTime>(i);
break;
}
}
}
private DateTimeType GetDate()
{
return new DateTimeType(new DateTime(2000, 1, 1), "MnemonicDate");
}
private IntType GetInt()
{
return new IntType(5, "MnemonicInt");
}
private StringType GetString()
{
return new StringType("ok", "MnemonicString");
}
}
,并希望避免在UtilValue
类在行return ((ICustomType<T>)customType).Value;
投,任何想法如何在保持设计的同时摆脱这一点?
我甚至不确定这个演员是否昂贵?我的猜测是肯定是。
你应该成为访问者模式:http://en.wikipedia.org/wiki/Visitor_pattern这应该解决你的问题,并避免演员和开关。 – 2013-04-06 21:08:43
@lasseespeholt:嗨!这看起来像一个有趣的想法,但不知道如何正确实现它。我将不得不阅读文章几次,并与这个想法一起玩...感谢您的建议。如果你可以提供这个想法的答案,那将是非常棒的! – ibiza 2013-04-06 21:17:41
现在有一个例子。确切的代码取决于你想在交换机上做什么。 – 2013-04-06 21:26:03