我有支持不同類型的列表下面的代碼:避免使用泛型投和自定義數據的列表
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