gpt4 book ai didi

c# - 静态实例基类/派生类

转载 作者:太空狗 更新时间:2023-10-29 21:50:17 25 4
gpt4 key购买 nike

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

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

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 中声明一个静态键,以获取此实例也用于代码隐藏绑定(bind)创建。

有了这个,应该可以只编写以获取在 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;
}
}

希望你能帮上忙,谢谢。

最佳答案

我认为您的代码中存在轻微的谬误。想象一下,如果您有:

SomeConverter : BaseConverter { ... }
SomeOtherConverter : BaseConverter { ... }

然后都是SomeConverter.InstanceSomeOtherConverter.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,因为在这个实现中它可能没有什么用处)。

关于c# - 静态实例基类/派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22530820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com