[英]Static Instance Base/Derived class
我想在基类中编写一个静态实例属性并派生它,但我遇到了一些问题。
这是基类的代码 - 我目前有:
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;
}
}
}
正如您所看到的,它主要用于转换等WPF资源,您通常在XAML中声明一个静态的键,以便为Codebehind Binding Creation获取此实例。
有了这个,应该可以编写来获取在XAML中声明的资源:
var fooConverter = FooConverter.Instance;
现在,这在基类中可以正常工作。
MethodBase.GetCurrentMethod()。DeclaringType.Name将始终返回“ResourceInstance”,我希望得到派生类名,因为在我们的Application中ClassName == ResourceKey
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;
}
}
希望你能帮助,thx。
我相信你的代码中存在轻微的谬误。 想象一下,如果你有:
SomeConverter : BaseConverter { ... }
SomeOtherConverter : BaseConverter { ... }
那么SomeConverter.Instance
和SomeOtherConverter.Instance
都是同一个对象(即ResourceInstance<IValueConverter>.Instance
) - 只设置一次(无论哪个被称为第一个),这可能不是你想要的。
以下怎么样? 稍微紧凑,但是。 解决了上面的问题和b。 工作:)
public abstract class ResourceInstance<TBase, TActual>
{
private static TBase _instance;
public static TBase Instance
{
get
{
if (_instance == null)
_instance = (T)Application.Current.TryFindResource(typeof(TActual).Name);
return _instance;
}
}
}
然后将您的类型声明为
SomeConverter : ResourceInstance<IValueConverter, SomeConverter>, IValueConverter { ... }
(我省略了BaseConverter
因为它可能没有给出这个实现的目的)。
不确定我是否正确理解你的问题,但我会这样做:
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
静态成员完全特定于declaring class
; subclasses
不会获得单独的副本。 这里唯一的例外是泛型; 如果开放泛型类型声明静态字段,则该字段特定于组成闭合泛型类型的类型参数的确切组合; 假设字段是在Foo上定义的,那么Foo会有单独的静态字段到Foo。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.