我想知道是否有可能以更通用的方式解决这个问题。
给两个视图模型几乎相同,区别在于命名(例如公共字符串描述和公共字符串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)) { ... }
答案 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;
}