Tag: derived class

调用基类静态方法时获取Caller派生类

我想知道是否有可能(甚至通过reflection et similia)在被调用的基类静态方法中获取调用者派生类。 例如,我有一个定义了静态方法的基类: public MyBaseClass { public static void MyBaseClassStaticMethod() { /** … **/ } } 以及派生自它的类: public MyDerivedClass : MyBaseClass { } 然后我打电话给: MyDerivedClass.MyBaseClassStaticMethod() 在方法MyBaseClassStaticMethod ,是否有可能知道哪个是调用者派生类型 ? (即MyDerivedClass ) 我只需要一个字符串……

C#:如何从派生类的静态方法调用基类的静态方法?

在C#中,我有基类Product和派生类Widget。 产品包含一个静态方法MyMethod()。 我想从静态方法Widget.MyMethod()调用静态方法Product.MyMethod()。 我不能使用base关键字,因为它只适用于实例方法。 我可以显式地调用Product.MyMethod(),但是如果我稍后将Widget更改为从另一个类派生,我必须修改该方法。 C#中有一些类似于base的语法允许我从派生类的静态方法中调用基类的静态方法吗?

从derived而不是base调用的虚方法

有人可以向我解释为什么在将类转换为基类时调用重写的方法: class Base { public virtual void VirtualMethod() { Console.WriteLine(“Base virtual method”); } } sealed class Derived : Base { public override void VirtualMethod() { Console.WriteLine(“Overriden method”); } } static void Main(String[] args) { Derived d = new Derived(); ((Base)d).VirtualMethod(); } 我的意思是这个代码打印: Overriden method 并不是 Base virtual method 它是一个运行时或编译时的未来? 我知道我可以通过调用base.VirtualMethod()来调用Base的虚方法,但是我可以从外面调用吗? (如来自Main或其他课程)

如何在不事先知道类型的情况下使用XmlSerializer反序列化可能是基类或派生类的对象?

在C#中,如何使用XmlSerializer反序列化可能是基类的对象,或者在不事先知道类型的情况下反序列化任何几个派生类? 我的所有派生类都添加了其他数据成员。 我做了一个简单的GUI,可以序列化和反序列化类对象。 它将序列化对象,因为任何inheritance的类(甚至只是基类)都适合于用户选择填充的字段。 我对序列化没有任何问题; 问题是反序列化。 如何在不事先知道类的情况下将XmlSerializer反序列化数据到正确的派生类? 我目前创建一个XmlReader来读取XML文件的第一个节点并从中确定类,它似乎适用于我的目的,但它似乎是一个非常不优雅的解决方案。 我在下面发布了一些示例代码。 有什么建议? BaseType objectOfConcern = new BaseType(); XmlSerializer xserializer; XmlTextReader xtextreader = new XmlTextReader(DEFAULT_FILENAME); do { xtextreader.Read(); } while (xtextreader.NodeType != XmlNodeType.Element); string objectType = xtextreader.Name; xtextreader.Close(); FileStream fstream = new FileStream(DEFAULT_FILENAME, FileMode.Open); switch (objectType) { case “type1”: xserializer = new XmlSerializer(typeof(DerivedType)); objectOfConcern = (DerivedType)xserializer.Deserialize(fstream); //Load fields […]

在C#4.0中,是否可以从generics类型参数派生类?

我一直在尝试这个,但我似乎无法解决这个问题。 我想做这个… public abstract class SingletonType : TBaseClass where TSingleton : TBaseClass, new() where TBaseClass : class { static TSingleton _singleton; public static TSingleton Singleton => _singleton ?? (_singleton = new TSingleton()); } 计划是像这样使用它,它可以在基类周围“包裹”单例模式…… public class SingletonFoo : SingletonType { } 但是,我一直这样做 无法从’TBaseClass’派生,因为它是一个类型参数 嗯……我认为类型正是你从中得到的! 那么我错过了什么? 注意:这当然是一个简单的例子,因为它没有添加任何有用的东西,但是假设SingletonType有许多与问题无关的其他逻辑,因此忽略了关注手头的问题。