c# readonly object

myermian picture myermian · Aug 23, 2010 · Viewed 23.4k times · Source

Is there any way to return a readonly instance of an object?

public class Person
{
    public String FirstName { get; set; }
    public String LastName { get; set; }
}

public class SomeClass
{
    public SomeClass(Person manager)
    {
        if (manager == null)
            throw new ArgumentNullException("manager");

        _manager = manager;
    }

    private readonly Person _manager;
    public Person Manager
    {
        get { return _manager; } //How do I make it readonly period!
    }
}

Is the only way to do this by returning a Clone() so that any changes are done to the Clone and not the original? I know for Arrays there is a function to return the Array as read-only. Oh, and I know this is a reference type... I'm moreover wondering if there's some hidden C# feature to lock the writing portion.

I was trying to come up with a Generic ReadOnly wrapper class, but couldn't figure out how to get the properties as readonly without doing some expensive reflection and the such.

Oh, and I'm really trying to avoid creating a second version of the class that is all readonly properties. At that point, I might as well return the clone.

Answer

statenjason picture statenjason · Aug 23, 2010

To save yourself from creating an extra class, you could make it implement it as an interface IPerson that only has read only properties.

public interface IPerson
{
    string FirstName { get; }
    string LastName { get; }
}
public class Person:IPerson
{
    public String FirstName { get; set; }
    public String LastName { get; set; }
}

public class SomeClass
{
public SomeClass(Person manager)
{
    if (manager == null)
        throw new ArgumentNullException("manager");

    _manager = manager;
}

private readonly Person _manager;
public IPerson Manager
{
    get { return _manager; } //How do I make it readonly period!
}
}