c#方法中的多返回类型

时间:2013-04-07 15:07:13

标签: c# overloading return-type

我有一个(字符串,对象)字典,对象(类)有一些值,包括由枚举定义的数据类型。我需要一个GetItemValue方法,它应该返回字典项的值。因此,返回类型必须是item对象中定义的类型。

Class Item
{
    String Name;
    DataValueType DataType;
    Object DataValue;
}

private Dictionary<string, Item> ItemList = new Dictionary<string, Item>();

void Main()
{
    int value;

    ItemList.Add("IntItem", new Item("IntItem", DataValueType.TInt, 123));
    value = GetItemValue("IntItem"); // value = 123
}

什么样的解决方案可以解决这个问题?

最诚挚的问候,

4 个答案:

答案 0 :(得分:3)

您可以使用Generic Classes

Class Item<T>
{
    String Name;
    T DataTypeObject;
    Object DataValue;

    public T GetItemValue()
    { 
        //Your code
        return DataTypeObject;
    }
}

答案 1 :(得分:2)

更好的解决方案是引入一个让所有类都实现的接口。请注意,接口不一定要指定任何行为:

public interface ICanBePutInTheSpecialDictionary {
}

public class ItemTypeA : ICanBePutInTheSpecialDictionary {
    // code for the first type
}

public class ItemTypeB : ICanBePutInTheSpecialDictionary {
    // code for the second type
}
// etc for all the types you want to put in the dictionary

把东西放进字典里:

var dict = new Dictionary<string, ICanBePutInTheSpecialDictionary>();

dict.add("typeA", new ItemTypeA());
dict.add("typeB", new ItemTypeB());

当您需要将对象强制转换为特定类型时,您可以使用if - elseif - 块,例如

var obj = dict["typeA"];
if (obj is ItemTypeA) {
    var a = obj as ItemTypeA;
    // Do stuff with an ItemTypeA. 
    // You probably want to call a separate method for this.
} elseif (obj is ItemTypeB) {
    // do stuff with an ItemTypeB
}

或使用反射。根据你有多少选择,可能更喜欢。

答案 2 :(得分:0)

如果你有一个'混合包'你可以做这样的事情......

class Item<T>
{
    public String Name { get; set; }
    public DataValueType DataType { get; set; }
    public T DataValue { get; set; }
}
class ItemRepository
{
    private Dictionary<string, object> ItemList = new Dictionary<string, object>();

    public void Add<T>(Item<T> item) { ItemList[item.Name] = item; }
    public T GetItemValue<T>(string key)
    {
        var item = ItemList[key] as Item<T>;
        return item != null ? item.DataValue : default(T);
    }
}

并像......一样使用它。

var repository = new ItemRepository();
int value;
repository.Add(new Item<int> { Name = "IntItem", DataType = DataValueType.TInt, DataValue = 123 });
value = repository.GetItemValue<int>("IntItem");

如果您只有几种类型 - 最好使用Repository<T>

答案 3 :(得分:0)

我找到了一个我想要的解决方案。感谢谷歌叔叔。 谢谢大家的关心。

 public dynamic GetValue(string name)
 {
     if (OpcDataList[name].IsChanged)
     {
         OpcReflectItem tmpItem = OpcDataList[name];
         tmpItem.IsChanged = false;
         OpcDataList[name] = tmpItem;
     }

     return Convert.ChangeType(OpcDataList[name].ItemValue.Value, OpcDataList[name].DataType);
 }