C#反射问题:如何询问类是否有一个名为

C#反射问题:如何询问类是否有一个名为,c#,reflection,C#,Reflection,我的代码中有一个类的多个实例,每个实例都有不同的配置等。这个类有一个委托eventhandler方法,它从发送方接收事件,然后需要对上面的一个对象执行一些操作 我想知道反思能否解决这个问题 private CatClass cat1; private CatClass cat2; private CatClass cat3; 我希望避免单独检查每个实例以确定它是否是我想要的对象。而是希望以某种方式检索发送事件已识别的对象实例 所以 谢谢你的帮助。这不太可能达到你想要的效果?出于好奇,发件人不给

我的代码中有一个类的多个实例,每个实例都有不同的配置等。这个类有一个委托eventhandler方法,它从发送方接收事件,然后需要对上面的一个对象执行一些操作

我想知道反思能否解决这个问题

private CatClass cat1;
private CatClass cat2;
private CatClass cat3;
我希望避免单独检查每个实例以确定它是否是我想要的对象。而是希望以某种方式检索发送事件已识别的对象实例

所以


谢谢你的帮助。

这不太可能达到你想要的效果?出于好奇,发件人不给你一个合适的例子吗? 如果没有,那么您应该将shot-CatClass实例放入字典中,并在需要时搜索该字典。

C#如果您“告诉”而不是“询问”时效果更好

换句话说,最好是有一个接口或基类,其中声明了
CatClass
成员,允许您使用该接口类型或基类的变量,而不是使用反射。我唯一担心的是,由于您希望使用的成员是私有的,这将阻止您使用接口


你真的在使用一个通过反射挖掘发送者的处理程序来检索私有成员吗?也许你应该重新思考你的方法。

你可以用反思来解决这个问题,但我建议不要这样做。反射很慢,这不太可能是需要反射的情况


为什么不准备一本字典(当你想按名字查找它们的时候)、一个列表或一个CatClass数组,然后对它们进行迭代,看看哪一个是你需要的呢?

好吧,就像上面提到的帖子一样,反射通常是个坏主意

this.GetType().GetMember(senderName) == null;

不过在这里可能有用。

我怀疑你在这一点上是否在乎,但你关于如何在反思中解决这一问题的具体问题从未得到回答。这里是你基本上会怎么做

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

有不同的方法来解决这个问题。反思当然不是正确的选择

一种方法是使用一组猫

Cat[] cats = new Cat[] { new Cat(), new Cat(), new Cat() };
与使用猫名不同,您将使用猫号

private void delegateHandler(int catNumber, object sender, CustomEventType evt)
{
    DoSomethingWith(cats[catNumber]);
}
还有一种方法是将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);
...
或者如果你不确定猫是否存在

if (catsByName.TryGetValue("Misty", out cat)) {
    DoSomethingWith(cat);
} else {
    CatNotFound();
}

谢谢大家。一张预先准备好的地图似乎是唯一的出路。我认为反思在这方面是有用的,但似乎没有什么回报我想要的。出于兴趣,反射解决方案是什么?是否有我遗漏的函数?类似这样的函数(但请注意,成员可能必须是内部的或受保护的,才能在反映的代码中显示):typeof(YourClass).GetFields(BindingFlags.Instane | BindingFlags.NonPublic | BindingFlags.Public);您将变量名与对象混淆。好好学习。
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();
}