我試圖寫一個方法,可以將一個現有的類復制到一個新的類中,但是沒有對源類的參考。 外面有很多樣本,但是在我的案例中,源物件和目標物件被定義為一個基類,而它們被創建為一個端類。
我的類是這樣的
我的類是這樣的
// my baseclass
public partial class ModelBase
{
[JsonIgnore] 。
public RowStatus Status { get; set; }
}
//我的一個端類。
public class ModelUser: BaseClasses.ModelBase: ModelUser.
{
public int? UserID { get; set; }
public string UserFirst { get; set; }
public string UserLastname { get; set; }
}
//還有很多從ModelBase派生出來的,當然......。
我想要的是,在一個基礎表單中(所有其他的表單都來自于此),我可以將一個現有的模型復制到一個新的表單中,而不需要對現有的模型進行參考。 因此,我嘗試使用序列化/反序列化來實作這一點,這很好,但只有當你知道確切的型別時,而在我的 BaseForm 中,我還沒有確切的型別,我在那里處理一個宣告為 ModelBase 的實體,但在一個派生表單中創建為 ModelUser,例如,
。換句話說,我有一個像這樣的基礎表單
。
public partial class FormMVBaseDetail
{
protected ModelBase model = null;
protected ModelBase _originalModel = null;
...
private void FormMVBaseDetail_Shown(object sender, EventArgs e)。
{
_originalModel = CloneModel(model)。
}
protected ModelBase CloneModel(ModelBase model)
{
string json = JsonConvert.SerializeObject(model)。
return JsonConvert.DeserializeObject<ModelBase>(json)。
}
}
public partial class FormMVBaseUser : FormMVBaseDetail
{
model = new ModelUser()。
...
//在代碼的某處,模型的一些屬性可能會改變...。
private void button1_Click(object sender, e)。
{
//現在我希望_originalModel是模型的精確拷貝。
//所以_originalModel應該是ModelUser的型別,而不是ModelBase。
///如何在不增加FormMBaseUser的代碼的情況下實作這一點?
if (_originalModel.UserFirst != model.UserFirst)
{ // do something }
}
第一個嘗試是這樣的
public ModelBase CloneModel(ModelBase model)
{
string json = JsonConvert.SerializeObject(model)。
return JsonConvert.DeserializeObject<ModelBase>(json)。
}
這有一個問題,盡管引數model是作為new ModelUser()創建的,但反序列化將使它成為ModelBase,它只有一個公共屬性,即Status。
如果我這樣做,那么它就會作業,但只適用于ModelUser
public ModelBase CloneModel(ModelBase model)
{
string json = JsonConvert.SerializeObject(model)。
return JsonConvert.DeserializeObject<ModelUser>(json)。
}
這在一個baseform中是沒有用的。 所以我嘗試的下一件事是這樣的
public object CloneModel(ModelBase model)?
{
string json = JsonConvert.SerializeObject(model)。
return JsonConvert.DeserializeObject<object>(json)。
}
我們的想法是像這樣使用它
ModelBase _originalModel = null。
_originalModel = (ModelBase)CloneModel(CurrentModel)。
但是由于某些原因,它總是反序列化為Newtonsoft.Json.Linq.JObject,而不是object,所以這對我來說也不起作用。
我怎樣才能做到這一點呢?
我已經閱讀了這些鏈接,但它們并沒有讓我更進一步
。
我如何使用反射來呼叫泛型方法? uj5u.com熱心網友回復: 你可以使用非通用版本的 它的第一個引數是字串,第二個引數是型別。
所以你的克隆函式將是這樣的: 你的克隆函式將是這樣的: uj5u.com熱心網友回復: Ygalbel的答案的通用版本是這樣的: 你是否希望基類是通用的,這取決于你的需求。
使用方法:
標籤:
在C#中只傳遞一個型別作為引數
當型別只有在運行時才知道時,我如何使用運算式樹來呼叫一個泛型方法?
使用變數作為型別JsonConvert.DeserializeObject()public object CloneModel(ModelBase model)。
{
string json = JsonConvert.SerializeObject(model)。
return JsonConvert.DeserializeObject(json, model.GetType() )。
public partial class FormMVBaseDetail < T> where T : ModelBase : ModelBase ?
{
protected T _model;
protected T _originalModel;
public T CloneModel(T model)
{
var json = JsonConvert.SerializeObject(model)。
return JsonConvert.DeserializeObject<T>(json)。
}
public partial class FormMVBaseUser : FormMVBaseDetail<ModelUser>
{
_model = new ModelUser()。
//其他代碼同前。
