gpt4 book ai didi

c# - 寻找一种更优雅的方式来对类属性执行自定义获取/设置功能

转载 作者:行者123 更新时间:2023-11-30 16:42:37 26 4
gpt4 key购买 nike

我正试图找到一种方法来改进我拥有的一些代码。我使用的第 3 方 API 具有非常复杂的 API 请求对象(我将其称为 ScrewyAPIObject),其中有大量重复。每次您要设置特定属性时,都可能需要一页代码。因此,我构建了一个库来提供围绕其属性设置/获取的简化包装器(并处理一些值预处理)。

这是它如何工作的精简 View :

public abstract class LessScrewyWrapper
{
protected ScrewyAPIRequest _screwy = new ScrewyAPIRequest();

public void Set(string value)
{
Set(_getPropertyName(), value);
}

public void Set(string property, string value)
{
// Preprocess value and set the appropriate property on _screwy. This part
// has tons of code, but we'll just say it looks like this:
_screwy.Fields[property] = "[" + value + "]";
}

protected string _getPropertyName()
{
// This method looks at the Environment.StackTrace, finds the correct set_ or
// get_ method call and extracts the property name and returns it.
}

public string Get()
{
// Get the property name being access
string property = _getPropertyName();

// Search _screwy's structure for the value and return it. Again, tons of code,
// so let's just say it looks like this:
return _screwy.Fields[property];
}

public ScrewyAPIRequest GetRequest()
{
return _screwy;
}
}

然后我有一个子类代表一种特定类型的复杂 API 请求(有多种类型都具有相同的结构但设置不同)。假设这个有两个字符串属性,PropertyA 和 PropertyB:

public class SpecificScrewyAPIRequest : LessScrewyWrapper
{
public string PropertyA
{
get { return Get(); }
set { Set(value); }
}
public string PropertyB
{
get { return Get(); }
set { Set(value); }
}
}

现在当我想使用这个库时,我可以这样做:

SpecificScrewyAPIRequest foo = new SpecificScrewyAPIRequest();
foo.PropertyA = "Hello";
foo.PropertyB = "World";
ScrewyAPIRequest request = foo.GetRequest();

这工作得很好而且花花公子,但是有不同种类的数据类型,这涉及到在我的 Set/Get 方法中使用泛型,当你处理 50 个属性和 50 个时,它只会让子类看起来有点笨拙Get() 和 Set() 调用的副本。

我想做的只是定义字段,如下所示:

public class SpecificScrewyAPIRequest : LessScrewyWrapper
{
public string PropertyA;
public string PropertyB;
}

这会让类(class)看起来更干净。问题是我不知道有什么方法可以让 .NET 在访问和修改字段值时对我的自定义处理程序进行回调。

我见过有人在 PHP 中使用 __set 和 __get 魔术方法(尽管以一种不打算使用它们的方式)做类似的事情,但我在 C# 中没有发现任何类似的东西。有什么想法吗?

编辑:我考虑过对我的类使用一种索引方法,该方法具有一个对象类型值,该值随后被转换为其适当的类型,但我更愿意保留使用特定类型定义属性的方法。

最佳答案

也许在你的情况下DynamicObject是一个合适的选择:

public class ScrewyDynamicWrapper : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
// get your actual value based on the property name

Console.WriteLine("Get Property: {0}", binder.Name);
result = null;
return true;
}

public override bool TrySetMember(SetMemberBinder binder, object value)
{
// set your actual value based on the property name

Console.WriteLine("Set Property: {0} # Value: {2}", binder.Name, value);
return true;
}
}

并定义你的包装器对象:

public class ScrewyWrapper
{
protected dynamic ActualWrapper = new ScrewyDynamicWrapper();

public int? PropertyA
{
get { return ActualWrapper.PropertyA; }
set { ActualWrapper.PropertyA = value; }
}

public string PropertyB
{
get { return ActualWrapper.PropertyB; }
set { ActualWrapper.PropertyB = value; }
}
}

但是,您不能使用这种方法依赖 ScrewyDynamicWrapper 中的属性类型,因此它取决于您的实际 API 要求 - 也许它不适合您。

关于c# - 寻找一种更优雅的方式来对类属性执行自定义获取/设置功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46482209/

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