0

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

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; }
4

1 回答 1

2

protected means that it is visible to the subclasses of DomainObjectWithKey. Your Clone method appears to be outside of DomainObjectWithKey.

Maybe you're looking for internal? internal allows you access to the member from within the same DLL.

于 2012-10-22T18:25:10.910 回答