将<t>转换为ViewModel

时间:2016-11-24 10:41:29

标签: c# generics type-conversion

我想知道是否有可能以更通用的方式解决这个问题。

给两个视图模型几乎相同,区别在于命名(例如公共字符串描述和公共字符串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语句,如:

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

4 个答案:

答案 0 :(得分: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>();
            ....
  }

答案 1 :(得分:0)

是的,这是可能的。最简单的方法是创建基本视图模型类:

public abstract class ViewModelBase { .. }

然后你可以添加一个通用的方法,如:

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

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

答案 2 :(得分:0)

如果您的多个TaskModel具有相同的签名,请使用您要比较的属性的接口。

另一种方法是将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);
    }

答案 3 :(得分:0)

为什么不使用IEquatable<T>

视图模型模型中实现它:

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;
}