generics и static
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 07.03.07 05:42
Оценка:
Как в 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>>
Re: generics и static
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 07.03.07 05:54
Оценка:
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>>
Re: generics и static
От: BluntBlind  
Дата: 07.03.07 05:59
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>Как в C# сделать аналогичное следующему C++ коду:

Как ты это отлаживать будешь потом?

Так врядли получится сделать по-нормальному. Generic должен компилироваться в IL код.
Т.е.
...
B()
{ paramB = T::staticParamA; }
...

невозможно, т.к. тип T неизвестен.
Re: generics и static
От: nikov США http://www.linkedin.com/in/nikov
Дата: 07.03.07 06:02
Оценка: 15 (1)
Здравствуйте, Odi$$ey, Вы писали:

OE>Как в C# сделать аналогичное следующему C++ коду:


Похоже, Вам сюда
Автор: nikov
Дата: 05.07.06
.
Re[2]: generics и static
От: Oleksandr V. Krysan  
Дата: 09.03.07 17:50
Оценка:
Я бы наверное сделал так


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();
    }
}
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.