我的代码中有一个类的多个实例,每个实例都有不同的配置等。这个类有一个委托eventhandler方法,它接收来自发送者的事件,然后需要用上述对象之一执行某些操作。
我想知道反思是否可以解决这个问题。
private CatClass cat1;
private CatClass cat2;
private CatClass cat3;
我想避免独立检查每个实例以查看它是否是我想要的对象。但是反而希望以某种方式检索发送事件已识别的对象实例。
所以
private void delegateHandler(string senderName, object sender, CustomEventType evt)
{
// given reciept of the senderName string,
// how do I perform an action on say the cat2 object
// Is it possible to ask the class if it has an object defined
// called 'cat2' and then proceed with performing an action on that object
}
感谢您的帮助。
答案 0 :(得分:1)
这是不太可能达到你想要的方式?出于好奇,发件人不会给你一个合适的实例吗? 如果没有,那么你应该将镜头CatClass实例放入一个词典中,并在需要时搜索该词典。
答案 1 :(得分:0)
如果你“告诉”而不是“问”,C#效果会更好。
换句话说,最好有一个接口或基类,其中声明了CatClass
成员,允许您使用该接口类型或基类的变量而不是使用反射。我唯一担心的是,由于您希望使用的成员是私有的,这将阻止您使用界面。
您是否真的使用通过反射挖掘发件人的处理程序来检索私有成员?也许你应该重新思考你的方法。
答案 2 :(得分:0)
你可以使用反射,但我建议你不要这样做。反思很慢,这种情况不太可能发生。
为什么没有字典(当你想通过名字查找它们),列表或CatClass数组并迭代它们以查看哪一个是你需要的?
答案 3 :(得分:0)
好吧,就像上面提到的帖子一样,反思通常是一个坏主意。
this.GetType().GetMember(senderName) == null;
虽然可能会在这里工作。
答案 4 :(得分:0)
我怀疑你在这一点上是否在乎,但你在反思中如何解决这个问题的具体问题从未得到回答。这基本上就是你要做的。
private void delegateHandler(string senderName, object sender, CustomEventType evt)
{
FieldInfo field = this.GetType().GetField(senderName, BindingFlags.NonPublic | BindingFlags.Instance);
if(field != null && field.Name == senderName)
{
CatClass cat = (CatClass)field.GetValue(this);
cat.DoWork();
}
}
答案 5 :(得分:0)
有不同的方法可以解决这个问题。反思当然不是正确的选择。
一种方法是使用一系列猫
Cat[] cats = new Cat[] { new Cat(), new Cat(), new Cat() };
不使用猫名,而是使用猫号
private void delegateHandler(int catNumber, object sender, CustomEventType evt)
{
DoSomethingWith(cats[catNumber]);
}
另一种方法是将猫本身作为发送者传递(这是通过事件处理程序处理的常用方法)
private void delegateHandler(object sender, CustomEventType evt)
{
Cat cat = (Cat)sender;
DoSomethingWith(cat);
}
另一种方法是给每只猫一个名字属性
public class Cat
{
public string Name { get; set; }
// Other properties and methods
}
然后使用字典存储猫
var catsByName = new Dictionary<string, Cat>();
Cat cat = new Cat { Name = "Tiger" };
catsByName.Add(cat.Name, cat);
...
然后你可以像这样得到一只猫
cat = catsByName["Tiger"];
或者,如果您不确定,猫是否存在
if (catsByName.TryGetValue("Misty", out cat)) {
DoSomethingWith(cat);
} else {
CatNotFound();
}