c# - 是否有针对具有外部 set/get 方法的强类型类成员的 C# 模式?

标签 c# .net c#-4.0

我有以下结构,并且想要一个同时具有以下两个类的优点的解决方案。第一类是使用字符串和强类型成员:

public class UserSessionData
{
    private string Get(string key)
    {
        throw new NotImplementedException("TODO: Get from external source");
    }
    private void Set(string key, string value)
    {
        throw new NotImplementedException("TODO: Set in external source");
    }

    public string CustomerNumber {
        get { return Get("CustomerNumber"); }
        set { Set("CustomerNumber", value); }
    }
    public string FirstName {
        get { return Get("FirstName"); }
        set { Set("FirstName", value); }
    }
    public string LastName {
        get { return Get("LastName"); }
        set { Set("LastName", value); }
    }

    // ... a couple of hundreds of these
}

我可以想象另一种方法是使用 enum 参数的 GetSet 方法。这是第二类:

public class UserSessionData
{
    public enum What {
        CustomerNumber, FirstName, LastName, // ...
    }

    public string Get (What what) { return MyExternalSource(what); }
    public string Set (What what, string value) { return MyExternalSource(what); }
}

但是类 #2 的消费者端并不漂亮:
UserSessionData.Get(UserSessionData.What.CustomerNumber)
将其与第一类进行比较:UserSessionData.CustomerNumber

在我的第一个类示例中是否有调用 Get 和 Set 方法的强类型方法?换句话说:我如何从这两个类中获益,即强类型成员的可维护性和美观的语法?

最佳答案

.Net 4.5 或更新版本

如果您使用 .Net 4.5 或更新版本,您可以使用 CallerMemberNameAttribute所以你可以这样调用它:

public string CustomerNumber {
    get { return Get(); }
}

要使其工作,请通过将属性添加到参数来修改 Get 方法:

private string Get([CallerMemberName] string key)
{
    ...
}

性能注意事项:编译器会在调用处插入一个字符串作为参数,所以速度很快。


.Net 4.0 或更早版本

如果您使用.Net 4.0 或更早版本,您仍然可以使用强类型属性名称而不是手动键入字符串,但您需要实现一个方法like this。从 Expression 中提取属性名称,然后你可以使用表达式调用它:

public string CustomerNumber {
    get { return Get(() => this.CustomerNumber ); }
}

setter 可以用相同的方式实现。

性能注意事项:字符串是在运行时提取的,因此这比使用 CallerMemberNameAttribute 慢。

关于c# - 是否有针对具有外部 set/get 方法的强类型类成员的 C# 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17550826/

相关文章:

c# - await Task.FromResult 有什么好处吗?

c#-4.0 - HttpListener 访问被拒绝

c# - ToArrayAsync() 抛出 "The source IQueryable doesn' t 实现 IAsyncEnumerable"

c# - WPF:无法在属性元素怪异上设置属性

c# - 在csproj文件中配置XamlRuntime和DefaultXamlRuntime意义

.net - 有人有 CSLA 的实际经验吗?

entity-framework - EF - 为什么有时是急切加载,有时是延迟加载

c# - 重定向到设备设置

c# - 从外部托管的应用程序和数据库导出数据

c# - 循环内的外部变量如何与 lambda 一起使用?