Das Gleiche gilt für Methoden zu:Wie kann ich zwei PropertyInfos oder Methoden zuverlässig vergleichen?
mir gegeben wird zwei Instanzen von Property oder Methoden, die aus der Klasse extrahiert wurden sie sitzen auf über GetProperty()
oder GetMember()
etc, (oder von einem Member vielleicht).
Ich will, um zu bestimmen, ob sie in der Tat auf die gleichen oder die gleiche Methode so
(propertyOne == propertyTwo)
oder
(methodOne == methodTwo)
Klar, dass nicht wirklich zu gehen arbeiten, könnten Sie auf die gleiche Eigenschaft schauen, aber es könnte aus verschiedenen Ebenen der Klassenhierarchie extrahiert worden sein (in diesem Fall propertyOne != propertyTwo
)
Of cours e, konnte ich bei DeclaringType aussehen und Wiederanforderung die Eigenschaft, aber das beginnt ein wenig verwirrend bekommen, wenn Sie anfangen zu denken über
- Eigenschaften/Methoden auf Interfaces deklariert und
- Eigenschaften/Methoden auf Klassen implementiert erklärt auf einer Basisklasse (virtuell) und außer Kraft gesetzt auf abgeleitete Klassen
- Eigenschaften/Methoden auf einer Basisklasse deklariert, mit ‚neuen‘ außer Kraft gesetzt (in IL Welt ist dies nichts besonderes iirc)
am Ende der Tag, ich möchte nur in der Lage sein, eine intelligente eq zu tun Ich bin zu 80% sicher, dass die oben genannten Aufzählungspunkte nicht alle Randfälle abdecken, und während ich mich einfach hinsetzen konnte, schreibe eine Menge Tests und fange an zu spielen. Ich bin mir bewusst, dass mein Low-Level-Wissen, wie diese Konzepte tatsächlich umgesetzt werden, nicht ausgezeichnete ist, und ich hoffe, dass dies ein bereits beantwortet Thema ist und ich nur bei der Suche saugen.
Die beste Antwort wäre mir ein paar Methoden geben, die oben und erklärt, welche Grenzfälle kümmern und warum :-)
Klärung genommen erreichen wurden:
wahrsten Sinne des Wortes, ich möchte sicherstellen, dass sie die gleiche Eigenschaft sind, sind hier einige Beispielepublic interface IFoo
{
string Bar { get; set; }
}
public class Foo : IFoo
{
string Bar { get; set; }
}
typeof(IFoo).GetProperty("Bar")
und
typeof(Foo).GetProperty("Bar")
Werden zwei Eigenschaft Infos zurückkehren, die nicht gleich sind:
public class BaseClass
{
public string SomeProperty { get; set ; }
}
public class DerivedClass : BaseClass { }
typeof(BaseClass).GetMethod("SomeProperty")
und
typeof(DerivedClass).GetProperty("SomeProperty")
kann ich nicht wirklich daran erinnern, ob diese beiden Rückkehr gleich Objekte jetzt, aber in meiner Welt Sie sind gleich.
Ähnlich:
public class BaseClass
{
public virtual SomeMethod() { }
}
public class DerivedClass
{
public override SomeMethod() { }
}
typeof(BaseClass).GetMethod("SomeMethod")
und
typeof(DerivedClass).GetProperty("SomeMethod")
Auch hier werden diese nicht überein - aber ich möchte, dass sie (ich weiß, sie sind nicht spezifisch gleich, aber in meiner Domain sie sind weil sie sich auf die gleiche ursprüngliche Eigenschaft beziehen)
Ich könnte es strukturell tun, aber das wäre "falsch".
Weitere Hinweise:
Wie beantrage Sie auch die Eigenschaft, dass eine andere Eigenschaft versteckt? Scheint eine meiner früheren Annahmen war ungültig, dass die Standardimplementierung von GetProperty("name")
standardmäßig auf die aktuelle Ebene verweisen würde.
BindingFlags.DeclaringType
erscheint nur am Ende Null zurück!
"Eigenschaften/Methoden, die für eine Basisklasse deklariert sind, überschrieben mit 'neu'" - Das heißt eigentlich * verstecken *, und sie sind * sicherlich * verschiedene Mitglieder. Es macht keinen Sinn, sie als "gleich" zu betrachten. – Ani
Nun, offensichtlich habe ich das nur schlecht formuliert - es wäre sehr schwer, Vergleichscode zu schreiben, um in diesem Fall wahr zu sein ;-) - es ist immer noch ein unglücklicher Pfad, der getestet werden muss, da ich strukturell vergleichenden Code denken kann . –
Können Sie die Frage besser klären? Willst du 'string.GetHashCode == int.GetHashCode' (weil ihre Basisdefinitionen vom selben Typ sind -' object'). Wie wäre es mit 'List .Count' vs.' HashSet .Count' (beide implementieren 'ICollection .Count')? –
Ani