在C#中是否可以使用某种类似C ++的预处理器(或任何东西)来使用类型名称或泛型类型作为代码中的标识符?
public abstract class PropSC<T1, T2, T3>
{
public T1 T1 { get; set; }
public T2 T2 { get; set; }
public T3 T3 { get; set; }
}
所以我以后可以使用
public class SomeClass : PropSC<SomeBLL, OtherBLL, OtherClass> {...
作为写作的捷径
public SomeBLL SomeBLL { get; set; }
...
这在C#中是否完全可以?
答案 0 :(得分:3)
不,使用泛型这是不可能的。标识符需要在编译时知道,但可以在运行时生成泛型类型(例如,使用MakeGenericType
)。
如果你真的需要这个,你必须使用某种代码生成工具。
答案 1 :(得分:0)
虽然不可能像你描述的那样完成(没有反射器或其他一些纯粹的邪恶来源),但这与你所描述的相似:
public class Property<T1> {
T1 _t1;
T1 Get<T1>() {
return _t1;
}
void Set<T1>(T1 t1) {
_t1 = t1;
}
}
// C# doesn't have variadic generics, but you could do something like this
// to get multiple type arguments
public class Property<T1, T2> : Property<T1> {
T2 _t2;
T2 Get<T2>() {
return _t2;
}
void Set<T2>(T2 t2) {
_t2 = t2;
}
}
public class Property<T1, T2, T3> : Property<T1, T2> {
T3 _t3;
T3 Get<T3>() {
return _t3;
}
void Set<T3>(T3 t3) {
_t3 = t3;
}
}
public class Property<T1, T2, T3, T4> : Property<T1, T2, T3> {
// ...
不,后一部分不是DRY,所以你可能希望最终将这种方法与一些反思合并。为了完整起见,请按照以下说明使用它:
public class SomeClass : Property<Thing1, Thing2, Thing3> { }
SomeClass someClass = new SomeClass();
someClass.Get<Thing1>();
someClass.Get<Thing2>();
someClass.Get<Thing3>();