2016-11-24 38 views
0

我想知道是否有可能以更通用的方式解決這個問題。將<T>轉換成ViewModel

舉兩個的ViewModels幾乎相同,不同的是在命名(如公共字符串描述和公共字符串ReviewDescription) 有一個比較功能,其工作原理是這樣:

private bool CompareTask(Models.Task model, TaskViewModel data) 
     { 
      bool same = false; 
        same = (model.Description == data.Description); // more compare 
      return same; 
     } 

的問題是:有沒有可能 - 如果是,如何 - 使用通用的瀏覽模式,這樣的事情:

private bool CompareTask<T>(Models.Task model, T data) 

,如果創建語句,如:

if (typeof(T) == typeof(TaskViewModel)){ ... } 
else if (typeof(T) == typeof(TaskReviewModel)) { ... } 

回答

0

視圖模型模型實現:

public class SomeViewModel : IEquatable<SomeModel> 
{ 
    bool IEquatable<SomeModel>.Equals(SomeModel model) 
     => model != null && SomeProperty == model.SomeOtherProperty; 
} 

現在,你可以實現此方法:

public bool AreEqual<T, S>(T a, S b) 
    where T : class 
    where S : class 
{ 
    IEquatable<S> equatableToB = a as IEquatable<S>; 

    return equatableToB != null && equatableToB.Equals(b); 
} 

你得到這種方法具有明顯的優勢:既有模型或視圖模型可以與一個或多個類別等同:

public class SomeViewModel : IEquatable<SomeModel>, IEquatable<SomeOtherModel> 
{ 
    bool IEquatable<SomeModel>.Equals(SomeModel model) 
     => model != null && SomeProperty = model.SomeOtherProperty; 


    bool IEquatable<SomeOtherModel>.Equals(SomeOtherModel model) 
     => model != null && SomeOtherProperty = model.EvenSomeOtherProperty; 
} 
+0

謝謝大家,我會用@Matías-Fidemraizer解決方案。 – Paxsentry

+0

@Paxsentry沒問題,不客氣! –

0

你可以有一個BaseViewModel作爲BaseClass的和實現泛型方法是這樣的:

public class BaseViewModel 
    { 
    /// add members 
    } 

public class TaskViewModel : BaseViewModel 
{ 
    /// add members 
} 

public class TaskReviewViewModel : BaseViewModel 
{ 
    /// add members 
} 


    private bool CompareTask<T>(Models.Task model) 
      where T:BaseViewModel 
    { 
     var instance = Activator.CreateInstance<T>(); 
      .... 
    } 
+0

我可以一直沿着,直到你做了'var instance = Activator.CreateInstance ();' - 爲什麼,已經有'T data'參數了? –

+0

@PeterB同意。這不是必需的 。 – esiprogrammer

0

是的,這是可能的。最簡單的方法是創建基礎視圖模型類:

public abstract class ViewModelBase { .. } 

然後你就可以添加一個通用的方法,如:

ViewModelBase GetViewModel<T>() where T : ViewModelBase { 

    // get or convert your viewmodel 
    return (t) Convert.ChangeType(typeof(T), this.ViewModel); 
} 
0

如果多個TaskModel具有相同的簽名使用的接口要的屬性比較。

另一種方法是你爲什麼不使用IEquatable<T>實現IEquatable到其他車型,做這樣的事情

public class Task 
{ 
} 

public class TaskViewModel : IEquatable<Task> 
{ 
    public bool Equals(Task other) 
    { 
     throw new NotImplementedException(); 
    } 
} 

private bool CompareTask<T>(Task model, T data) 
     where T : IEquatable<Task> 

    { 
     return data.Equals(model); 
    } 
相關問題