2014-02-26 39 views
0

我正在尝试使用泛型方法。但是一个特定类型的对象存在一些问题,所以对于该特定类型,但由于类型不匹配而出现错误。我该如何纠正这一点?不同于定义的泛型类型的条件返回

private static T GetObjectFromFile<T>(string filename) 
     { 
      IsolatedStorageFile AppIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication(); 
      IsolatedStorageFileStream ISFileStream = AppIsolatedStorage.OpenFile(filename, System.IO.FileMode.Open); 
      byte[] buffer = new byte[ISFileStream.Length]; 
      ISFileStream.Read(buffer, 0, buffer.Length); 
      ISFileStream.Close(); 
      string data = Encoding.UTF8.GetString(buffer, 0, buffer.Length); 
      if (typeof(T) == typeof(MonitorBriefs)) 
      { 
       return JsonParser.ParseMonitorBrief(data);//this is incorrect statement 
      } 
      else 
      { 
       return JsonConvert.DeserializeObject<T>(data); 
      } 
     } 
+0

你需要转换到'T'为了满足编译器的要求的代码:'回报( T)JsonParser.ParseMonitorBrief'由于类型检查和我的假设,类型实际上是相同的,应该真的最终只是一种形式。 –

+0

@AdamHouldsworth已经尝试过了,它说不能从MonitorBrief转换到T – Ankit

+1

你可以总是先尝试将对象转换为我想要的,但是如果你不得不求助于你的设计,到那种事情。 –

回答

0

不那么漂亮,但试试这个:

private static T GetObjectFromFile<T>(string filename) 
    { 
     IsolatedStorageFile AppIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication(); 
     IsolatedStorageFileStream ISFileStream = AppIsolatedStorage.OpenFile(filename, System.IO.FileMode.Open); 
     byte[] buffer = new byte[ISFileStream.Length]; 
     ISFileStream.Read(buffer, 0, buffer.Length); 
     ISFileStream.Close(); 
     string data = Encoding.UTF8.GetString(buffer, 0, buffer.Length); 
     if (typeof(T) == typeof(MonitorBriefs)) 
     { 
      return (T)(object)JsonParser.ParseMonitorBrief(data);//this is incorrect statement 
     } 
     else 
     { 
      return JsonConvert.DeserializeObject<T>(data); 
     } 
    } 
0

不幸的是这是不可能与.NET。你可以移除这个方法之外的if语句,并将返回类型设置为T.或者用户一个包装器对象,你可以在这里设置两种类型并返回它们。

它投射到一个对象不应该是一种选择,因为你需要将它转换回在调用方法

+0

它不应该是一个选项,但它确实有效。它将任何投射问题移入运行时。 –