我一直想知道 - 在c#中有一种方法可以为类中的几个属性定义“模板”。这就是我的意思: 我们假设我有以下课程
class MyCLass
{
public int IntVal1 { get {...}; set{...} }
public byte IntVal2 { get {...}; set{...} }
....
public long IntValN { get {...}; set{...} }
}
我没有在get和set访问器中编写任何特定的实现,但是想法是所有这些属性都有非常相似的实现 - 不同之处可能是它们在类的不同成员上运行,这些成员具有不同的类型,但作为整个他们都看起来很像。
我的想法是找到一种方法来定义某种(让我们称之为)“模板”,其中包含一些可能用于声明所有这些属性的参数,而无需编写每个属性的实际实现。他们 - 也许使用属性!?!
我想我需要的是类似于C宏。
提前10倍答案 0 :(得分:3)
简短的回答是“不”,但你可以采取一些措施来减少重复。例如,考虑:
private bool SetField<T>(ref T field, T value,
[CallerMemberName] string memberName = null)
{
if (!EqualityComparer<T>.Default.Equals(field, value))
{
field = value;
var handler = PropertyChanged;
if (handler != null) handler(this,
new PropertyChangedEventArgs(memberName));
return true;
}
return false;
}
可用于减少开销,例如:
private string bar;
public string Bar
{
get { return bar; }
set { SetField(ref bar, value); }
}
答案 1 :(得分:1)
是的,如果我理解正确,在C#中我们使用泛型:
class MyCLass<T>
{
public T Val { get {...}; set{...} }
}
T
定义了您想要“模板”的类型。
然后你就像这样使用这个类:
var myClassInt = new MyClass<int>();
myClassInt.Val // is an integer
答案 2 :(得分:1)
您可以查看T4 templates
并从中生成代码:http://msdn.microsoft.com/en-us/library/vstudio/bb126445.aspx
如果使用部分类,则可以使用一个用于生成的代码,另一个用于非生成的代码。
这是一个很好的教程:http://t4-editor.tangible-engineering.com/How-Do-I-With-T4-Editor-Text-Templates.html
答案 3 :(得分:0)
您需要基类中的虚拟受保护方法。此方法将设置属性。在子类中,您可以继承基本实现或覆盖Init / Set / Get方法并进行自定义实现。
abstract class BaseMyClass
{
public BaseMyClass(arg1, arg2,...)
{
Init(arg1, arg2,...);
}
public int IntVal1 { get {...}; set{...} }
public byte IntVal2 { get {...}; set{...} }
public byte IntVal3
{
get
{
return GetIntVal3();
}
set
{
SetIntVal3(value);
}
}
protected void virtual Init(arg1, arg2,...)
{
//Init properties
}
protected virtual byte GetIntVal3()
{
//Implementation
}
protected virtual void SetIntVal3(value)
{
//Implementation
}
}
class MyCLass : BaseMyClass
{
public MyCLass(arg1, arg2, ...): base(arg1, arg2,...)
}
class AnotherMyCLass : BaseMyClass
{
public MyCLass(arg1, arg2, ...): base(arg1, arg2,...)
protected override void Init(arg1, arg2,...)
{
//Init properties
}
}