为什么静态方法不提供受保护的setter属性?

时间:2012-10-22 18:21:06

标签: c# clone static-methods

我有一个特定基类型的静态帮助器克隆方法,它不允许我设置基本属性设置器。

public static T Clone<T>(this T source, DomainKey cloneKey)
    where T : DomainObjectWithKey
{
    T clone = source.Clone(); // binary formatter returns object of type T
    clone.Key = cloneKey; // this does not compile
    return (T)clone;
}

public class DomainObjectWithKey
{
    public DomainKey Key { get; protected set; }

另一种解决方案是将Clone方法放在类本身中,然后允许我使用受保护的setter。但是,我必须指定何时从我的派生对象调用Clone,这似乎毫无意义。

因此我的问题是,是否由于封装而无法从静态方法调用受保护的setter方法?

替代解决方案的示例,但为什么我必须指定类型?

category.Clone<Category>(otherCategory.Key); // why do I have to specify <Category> here?

public class Category : DomainObjectWithKey
{
    public long CategoryId { get { return ((IdDomainKey)Key).Id; } }

    public Category(long categoryId)
    {
        Key = new IdDomainKey(categoryId);
    }
}

解决方案

我最终得到了一个公共属性,因此Key可以从派生类的实例访问,但是对setter保护内部,允许静态帮助器方法设置属性。

public class DomainObjectWithKey
{
    public DomainKey Key { get; protected internal set; }

1 个答案:

答案 0 :(得分:2)

protected表示它对DomainObjectWithKey的子类可见。您的Clone方法似乎不在DomainObjectWithKey范围内。

也许您正在寻找internalinternal允许您从同一DLL中访问该成员。