有人知道是否可以在方法中传递一个类(在c#中)?
或者也许可以提供一些有关如何更好地解决/解决这个问题的见解,因为它可能是“无法从树上看到森林”类型的东西。
基本上,我有不同类型的对象(人,车辆,位置和物品)我正在处理,我想让用户添加/编辑/查看/删除
这些对象。为了支持这一点,我创建了一个表单(我将其称为“ObjecctSelect表单”),允许用户从对象列表中选择特定对象(我将“对象类型”传递给表单和表单然后知道创建这些对象的列表,用户可以从中选择...例如车辆。一旦用户选择了一个对象,ObjectSelect表单就会调用另一个表单(根据对象类型的不同而不同,因为我有一个AEVD_Vehicle表单,一个AEVD位置表单等),这将允许用户添加/编辑/查看/删除选定的对象。
当我将对象“定义良好”时,这实际上工作得很好但是现在我可能需要一些“自定义”对象,并希望我可以传入add / edit / view / delete“自定义对象“形成我的”ObjectSelect“表单。我知道我可以传递一个类的实例(而不是类本身)但是在选择对象之前我真的没有构造函数信息...或者用户是否选择了是否要添加,编辑,查看或删除所选对象。
BTW,我希望能够传递给表单的另一个原因是我将“objectSelect”表单放入一个库中,该库正在被我们正在开发的几个应用程序使用。事实证明,根据我们正在处理的平台,“AddEditDelete对象表单”可能需要不同的制造商库来引用它,我不希望我的“库”引用所有这些制造商库。 ......加上这些制造商处理的事情不同。例如,一些添加/编辑/查看/删除表单包括条形码扫描和拍照 - 一个制造商,我必须在做另一个之前关闭一个,而对于另一个制造商,我不需要做任何事情..这有意义吗?或者我应该采用不同/更好的方式处理这个问题?
答案 0 :(得分:0)
我认为我开始接近这样的问题的方法是考虑你想要用特定类型做的所有不同的事情。从目前为止列出的内容来看,听起来对于每种类型,您都有办法获取数据以及编辑具有关联表单的项目的方法。所以看起来有意义的是将所有实现围绕特定类型并将其放入某种类型的公共结构中,然后使用该结构来完成工作。
例如,假设我们的两种类型的对象是整数和字符串而不是车辆等。 然后你可以做这样的事情:
public interface IEditorForm
{
void SetItemToEdit(object item);
object GetModifiedItem();
}
public class DataModifierFactory
{
public Func<IEnumerable<object>> GetData { get; set; }
public Func<IEditorForm> EditorFormFactory { get; set; }
}
//in your code, set up how the types will get handled
//keep this registration of types and editor info on ObjectSelect form
Dictionary<Type,DataModifierFactory> myModifiers = new Dictionary<Type,DataModifierFactory>();
Func<IEnumerable<object>> intDataSource = ()=>{ return new int[] { 0,1,2,3 }; };
Func<IEditorForm> intEditorFormFactory = ()=>new IntEditorForm();
myModifiers.Add(typeof(int), new DataModifierFactory(){GetData=intDataSource,EditorFormFactory=intEditorFormFactory};
Func<IEnumerable<object>> stringDataSource = ()=>{ return new string[] { "A","B","C" }; };
Func<IEditorForm> stringDataFormFactory = ()=>new StringEditorForm();
myModifiers.Add(typeof(string), new DataModifierFactory(){GetData=stringDataSource,EditorFormFactory=stringDataFormFactor};
//On object select form
//this variable is set from above
Dictionary<Type,DataModifierFactory> m_DataModifierFactoryRegistry;
IEditorForm m_ItemEditorForm;
public void ModifyDataOfType<T>()
{
DataModifierFactory factory = m_DataModifierFactoryRegistry[typeof(T)];
myListOfData.Source = factory.GetData();
m_ItemEditorForm = factory.EditorFormFactory();
}
public void OnSelectedItemChanged(object newItem)
{
object oldItem = m_ItemEditorForm.GetModifiedItem();
//save the old item, etc. Possibly another item on DataModiferFactory
//then set up for the next
m_ItemEditorForm.SetItemToEdit(newItem);
}
无论如何,这应该给出基本的想法。而不是使用Func,你当然可以将工厂作为接口等。在WPF中,我知道我会尝试使用泛型而不是对象用于项目编辑器表单等,但我不知道你的场景有多复杂。
这会解决您的问题吗?