基于通用的成员名称

时间:2014-03-21 15:05:39

标签: c# generics

在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#中是否完全可以?

2 个答案:

答案 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>();