Как в C# сделать аналогичное следующему C++ коду:
class A
{
public:
static int staticParamA;
};
int A::staticParamA = 5;
template <typename T>
class B
{
public:
B()
{
paramB = T::staticParamA;
}
int paramB;
};
B<A> b;
т.е. в
B использовать параметры, зависящие от
T до создания его экземпляра.
Облом что так:
class B<T>
{
B()
{
int paramB = T.paramA; // error CS0119: 'T' is a 'type parameter', which is not valid in the given context
}
}
что так:
class A
{
public static int paramA = 5;
}
class B<T> where T : A
{
B()
{
int paramB = T.paramA; // error CS0119: 'T' is a 'type parameter', which is not valid in the given context
}
}
... << RSDN@Home 1.2.0 alpha rev. 675>>
OE>что так:
OE>OE> class A
OE> {
OE> public static int paramA = 5;
OE> }
OE>
а, ну и опять же "A static member cannot be marked as override, virtual, or abstract"
... << RSDN@Home 1.2.0 alpha rev. 675>>
Здравствуйте, Odi$$ey, Вы писали:
OE>Как в C# сделать аналогичное следующему C++ коду:
Как ты это отлаживать будешь потом?
Так врядли получится сделать по-нормальному. Generic должен компилироваться в IL код.
Т.е.
...
B()
{ paramB = T::staticParamA; }
...
невозможно, т.к. тип T неизвестен.
Здравствуйте, Odi$$ey, Вы писали:
OE>Как в C# сделать аналогичное следующему C++ коду:
Похоже, Вам
сюдаАвтор: nikov
Дата: 05.07.06
.
Я бы наверное сделал так
using System;
using System.Collections.Generic;
namespace ConsoleApplication2
{
[AttributeUsage(AttributeTargets.Struct | AttributeTargets.Class)]
public class StaticMethodAttribute : Attribute
{
// Fields
public StaticMethodAttribute()
{
}
// Properties
public virtual string GetName()
{
return MyClass.GetName();
}
}
public class OtherStaticMethodAttribute : StaticMethodAttribute
{
public OtherStaticMethodAttribute() : base()
{
}
public override string GetName()
{
return MyClassModified.GetName();
}
}
[StaticMethod()]
public class MyClass
{
public static string GetName()
{
return "This is MyClass";
}
}
[OtherStaticMethod()]
public class MyClassModified : MyClass
{
public static new string GetName()
{
return "This is MyClassModified";
}
}
public class SomeGeneric<T> where T : MyClass, new()
{
private static class Static
{
internal static StaticMethodAttribute T;
}
static SomeGeneric()
{
object[] attr = typeof(T).GetCustomAttributes(typeof(StaticMethodAttribute),false);
Static.T = (StaticMethodAttribute)attr[0];
}
public static void Foo()
{
string name = Static.T.GetName();
Console.WriteLine(name);
}
}
public class Program
{
public static void Main()
{
SomeGeneric<MyClass>.Foo();
SomeGeneric<MyClassModified>.Foo();
}
}
}