c# =在方法中传递类变量
本文关键字:类变量 方法 | 更新日期: 2023-09-27 18:11:34
有人知道在方法中传递类是否可能吗(在c#中)?
或者提供一些关于我如何更好地解决/处理这个问题的见解,因为它可能是一个"不能从树木中看到森林"类型的事情。
基本上,我有不同类型的对象(人,车辆,位置和物品),我想让用户添加/编辑/查看/删除
这些对象。为了支持这一点,我创建了一个表单(我将其称为"ObjecctSelect表单"),允许用户从对象列表中选择特定的对象(我将"对象类型"传递给表单,然后表单知道创建这些对象的列表,用户可以从中选择……例如车辆)。一旦用户选择了一个对象,ObjectSelect表单就会调用另一个表单(根据对象类型而变化,因为我有一个AEVD_Vehicle表单,一个AEVD Location表单等),这将允许用户添加/编辑/查看/删除所选对象。
这实际上工作得很好,当我有对象"定义良好",但现在我可能需要一些"自定义"对象,并希望我可以在添加/编辑/视图/删除"自定义对象"表单到我的"ObjectSelect"表单。我知道我可以传递一个类的实例(而不是类本身),但我真的没有构造函数信息,直到对象被选中…或者用户是否选择了是否要添加、编辑、查看或删除所选对象。
顺便说一句,我想要能够传递到一个表单的另一个原因是,我已经把"objectSelect"表单放入一个库中,这个库正在被我们正在开发的几个应用程序使用。事实证明,根据我们正在处理的平台,"addditdelete对象表单"可能需要它引用不同的制造商库,我不想让我的"库"引用所有这些制造商库....此外,这些制造商处理问题的方式也不同。例如,一些添加/编辑/查看/删除表单包括条形码扫描和拍照-对于一个制造商,我必须在执行另一个之前关闭一个,而对于另一个制造商,我不需要做任何事情…
这有意义吗?或者我应该有一个不同的/更好的方式来处理这件事?
我认为我开始处理这样一个问题的地方是通过考虑您想要对特定类型做的所有不同的事情。从目前列出的内容来看,对于每种类型,似乎都有一种获取数据的方法和一种使用关联表单编辑项的方法。因此,似乎有意义的做法是,围绕特定类型采取所有实现,并将其放入某种公共结构中,然后使用该结构来完成工作。
例如,假设我们的两种对象类型分别是int和string,而不是vehicle,等等。然后你可以这样做:
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中,我知道我会尝试使用泛型而不是对象的项目编辑器表单等,但我不知道你的场景有多复杂。
这解决你的问题了吗?