调用ToDictionary <k,v =“”>并从泛型方法中转换<k,v =“”> </k,> </k,>

时间:2015-04-16 19:50:02

标签: c# templates generics casting

我从具有元数据信息的服务器获得回复。我有一些表,我正试图从json加载。我想要执行此操作的代码如下:

接口

public interface DALObject
{
    public Object Id();
    public Object Instantiate();
}

类示例:

[System.Serializable]
public class UnitClass_DAL : DALObject
{
    public string GOOGLEFU_ID { get; set; }
    public int _id { get; set; }
    public string name { get; set; }

    object DALObject.Instantiate()
    {
        return Instantiate();
    }

    object DALObject.Id()
    {
        return _id;
    }

    public int Id()
    {
        return _id;
    }

    public UnitClass Instantiate( )
    {
        UnitClass temp = new UnitClass();
        temp.id = _id;
        temp.name = name;
        return temp;
    }
}

在我的RemoteAPIService类中加载方法:

public void LoadMetadataResource<DALType, K, V>(IDictionary<K, V> list, string resource) where DALType: DALObject
{
    ++activeLoads;
    var parameters = new SortedDictionary<string, string>();
    parameters.Add("table", resource);
    SendAPICall("tables", parameters, (successResponse) =>
        {
            list = JsonMapper.ToObject<List<DALType>>(successResponse).ToDictionary(temp => temp.Id() as K, temp => temp.Instantiate() as V);
            --activeLoads;
        }, (errorResponse) =>
        {
            --activeLoads;
        });
}

我遇到的问题是我想打电话给这样的话:

//...
LoadMetadataResource<UnitClass_DAL, int, UnitClass>(GameDataHolder.UnitClass, "UnitClass");
//...

GameDataHolder.UnitClass的类型为:Dictionary&lt; int,UnitClass&gt;

尝试将temp.Id()转换为K或temp.Instantiate()为V时出错。我需要将其加载到GameDataHolder的特定数据类型中,而不是通用的基类类型。

这在C#中是否可行?

1 个答案:

答案 0 :(得分:0)

Casting value to T in a generic method

事实证明&#34; as&#34;在这种情况下,不适合投射。我只能通过c风格的演员来解决我的问题:

    public void LoadMetadataResource<DALType, K, V>(IDictionary<K, V> list, string resource) where DALType: DALObject
    {
        ++activeLoads;
        var parameters = new SortedDictionary<string, string>();
        parameters.Add("table", resource);
        SendAPICall("tables", parameters, (successResponse) =>
            {
                list = JsonMapper.ToObject<List<DALType>>(successResponse).ToDictionary(temp => (K)temp.Id(), temp => (V)temp.Instantiate());
                --activeLoads;
            }, (errorResponse) =>
            {
                --activeLoads;
            });
    }

如果不能解决这个问题,我会跟进,但看起来它会编译。