C#反射问题:如果一个类有一个被调用的对象,如何询问它

时间:2009-05-04 11:33:37

标签: c# reflection

我的代码中有一个类的多个实例,每个实例都有不同的配置等。这个类有一个委托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
}    

感谢您的帮助。

6 个答案:

答案 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();
}