2012-08-23 103 views
4

目前正在创建功能我有以下功能与通用返回类型

public int GetVariableValue(TaxReturn taxReturnObj, string identityKey) 
    { 
     int returnTypeOut = 0; 
     if (taxReturnObj.Identity.ContainsKey(identityKey)) 
     { 
      int.TryParse(taxReturnObj.Identity[identityKey], out returnTypeOut); 
     } 
     return returnTypeOut; 
    } 

检索我们使用下面的代码值,

例如

int valPayStatus = GetVariableValue(objTaxretrun, TaxReturnIdentity.aadata_identity_paystatus) 

现在是工作的罚款,直到为所有身份值分别是整数,但最近我们增加了与字符串和布尔类型的新Identites。 所以我想使上述功能为通用 ...但我不知道如何去做,我试图搜索谷歌,但找不到任何东西。

+1

“我试图在谷歌上搜索,但没有找到任何东西”谷歌去世了吗?!检查...一切都很好,它可以找到[this]这样的东西(http://blog.kjeldby.dk/2009/06 /使用泛型方法和约束/) – Reniuz

+2

我会去不同的方法:GetVariableValueAsInt,GetVariableValueAsString,...这里的问题是,你要为每种类型(int.parse,bool.parse,简单的强制转换为字符串......)进行特定的处理,所以有些类型将被保留出。通过调用一个通用方法GetVariableValue ,我无法知道接受T的类型以及哪些类型会抛出异常。 –

回答

3
public T GetVariableValue<T>(TaxReturn taxReturnObj, string identityKey) 
    { 
     if (taxReturnObj.Identity.ContainsKey(identityKey)) 
     { 
      return (T) Convert.ChangeType(taxReturnObj.Identity[identityKey], typeof(T)); 
     } 
     else 
     { 
      return default(T); 
     } 
    } 
+0

非常感谢你......没有什么变化..完美的工作.. :) –

5

我会这样做,也许有更好的方法;

public T GetVariableValue<T>(TaxReturn taxReturnObj, string identityKey) 
     { 
      if (taxReturnObj.Identity.ContainsKey(identityKey)) 
      { 
       if(typeof(T) == Int32) 
       {  
        int returnTypeOut = 0; 
        int.TryParse(taxReturnObj.Identity[identityKey], out returnTypeOut); 
        return returnTypeOut; 
       } 
       else if (typeof(T) == System.String) 
       { 
       //code here 
       } 
      } 
      return default(T); 
     } 

而且你可以这样调用

int valPayStatus = GetVariableValue<int>(objTaxretrun, TaxReturnIdentity.aadata_identity_paystatus) 


string valPayStatusStr = GetVariableValue<string>(objTaxretrun, TaxReturnIdentity.aadata_identity_paystatus) 
+0

感谢您的帮助...但这里的问题是我不能直接返回,因为我使用int.parse方法,它需要输出参数...并且输出参数需要首先初始化..那就是我正在编译的地方错误... –

+0

不用担心,看到我编辑的答案,是你需要什么? – saj

1
public T GetVariableValue<T>(TaxReturn taxReturnObj, string identityKey) 
{ 
    if (taxReturnObj.Identity.ContainsKey(identityKey)) 
    { 
     return (T)taxReturnObj.Identity[identityKey]; 
    } 
    return default(T); 
} 

像这样的事情? 不意味着它不会抛出一个错误,如果你通过它错误类型寿。

+0

你会得到一个错误,'功能应该返回一个值' – Habib

+0

啊是的,失去了返回,如果良好的捕获。 –

+0

我会这样做,但可能围绕它尝试赶上 –

1

你可以尝试这样的事:

public T GetVariableValue<T>(TaxReturn taxReturnObj, string identityKey) 
{ 
    if (taxReturnObj.Identity.ContainsKey(identityKey)) 
    { 
     return taxReturnObj.Identity[identityKey]; 
    } 
    return default(T); 
} 

,如果你发现在你的字典中keyIdentity然后返回特定的值,没有解析它,否则你可能会返回default

+0

为什么这个工作?我不认为有可能将对象隐式转换为T.我猜测Identity属性是一个对象列表。 –

+0

好,从'ContainsKey',身份看起来像一个字典,可以定义为'公共字典<字符串,动态>标识{获取;组; }' – Habib

+0

它可能是'public Dictionary Identity {get;组; }' –