静态实例基类/派生类

兰德随机

我想在基类中编写一个静态实例属性并派生此实例,但是我遇到了一些问题。

这是基类的代码-我目前有:

public abstract class ResourceInstance<T>
{
    private static T _instance;
    public static T Instance
    {
        get
        {
            if (_instance != null)
                return _instance;

            var method = MethodBase.GetCurrentMethod();
            var declaringType = method.DeclaringType;
            if (declaringType != null)
            {
                var name = declaringType.Name;
                _instance = (T)Application.Current.TryFindResource(name);
            }

            return _instance;
        }
    }
}

如您所见,它的主要用途是用于Converts之类的WPF资源,通常您在XAML中声明一个静态的键,以便将该实例也用于Codebehind Binding Creation。

有了它,应该可以编写以获取在XAML中声明的资源:

var fooConverter = FooConverter.Instance;

现在,这在基类中可以正常工作。

  1. MethodBase.GetCurrentMethod()。DeclaringType.Name将始终返回“ ResourceInstance”,我希望获得派生的类名,因为在我们的应用程序中,ClassName == ResourceKey

  2. Resharper,总是抱怨我正在快速从派生类访问静态属性,并希望我通过基类访问它

这是派生类的示例:

public abstract class BaseConverter : ResourceInstance<IValueConverter>, IValueConverter
{
    public virtual object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }

    public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }
}

public class FooConverter : BaseConverter
{
    public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return true;
    }
}

希望您能提供帮助,谢谢。

托马斯·列夫斯克

不知道我是否正确理解了您的问题,但是我会这样做:

public class ResourceInstance<T>
    where T : ResourceInstance<T> // To ensure correct usage
{
    private static T _instance;
    public static T Instance
    {
        get
        {
            if (_instance != null)
                return _instance;

            var name = typeof(T).Name;
            _instance = (T)Application.Current.TryFindResource(name);

            return _instance;
        }
    }
}

public class FooConverter : ResourceInstance<FooConverter>, IValueConverter
{
    ...
}

对T的约束确保将类与模式一起使用class X : ResourceInstance<X>; 这样,typeof(X)将永远是X

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

静态实例基类/派生类

来自分类Dev

从基类创建派生类的实例

来自分类Dev

返回派生类实例而不是基类实例

来自分类Dev

对基类和派生类使用静态容器

来自分类Dev

使用派生类常量的基类静态方法

来自分类Dev

如何从派生类中获取基类实例

来自分类Dev

从基类实例调用派生类方法

来自分类Dev

从基类的实例调用派生类的函数

来自分类Dev

从基类成员函数返回派生类的实例

来自分类Dev

如何从派生类生成javascript基类实例

来自分类Dev

从基类实例调用派生类方法

来自分类Dev

基类的工厂方法实例化派生类

来自分类Dev

在基类的实例上设置派生类的属性

来自分类Dev

在基类内部使用派生类实例调用带有派生类数据的基类方法

来自分类Dev

从派生类创建基类对象

来自分类Dev

从基类的派生类访问属性

来自分类Dev

从基类方法克隆派生类

来自分类Dev

非多态派生类的基类

来自分类Dev

基类中派生类的组成

来自分类Dev

从派生类访问基类对象

来自分类Dev

派生类定义的基类集合

来自分类Dev

对派生类对象的基类引用

来自分类Dev

从基类指针访问派生类

来自分类Dev

从基类指针克隆派生类

来自分类Dev

从基类方法克隆派生类

来自分类Dev

从派生类计算基类参数

来自分类Dev

基类中派生类的组成

来自分类Dev

从基类修改派生类的值

来自分类Dev

如何从基类的实例创建派生类的实例并包含私有字段?