ссылка на класс c # в отличие от ссылки на экземпляр - PullRequest
3 голосов
/ 20 февраля 2012

Могу ли я локально ссылаться на класс в C # вместо экземпляра класса? Следующий код не будет компилироваться, но, например, что-то вроде:

void someFunc()
{
    var a = System.Math;
    var b = a.Abs(4);
}

edit: в реальной программе это не класс System.Math, и я хочу создать класс и вернуть построенное значение. Первоначально я не думал, что контекст, в котором я хотел бы использовать класс, будет подходящим, и, вероятно, этого не должно быть.

У Анастасиосияля есть интересная идея с использованием местного делегата для этого.

Ответы [ 6 ]

8 голосов
/ 20 февраля 2012

Вы можете ссылаться на класс:

Type math = typeof(System.Math);

Но вы не можете вызывать статические методы для него, используя синтаксис обычной точки:

// Wont compile:
math.Abs(5);

Если вы просто хотите сократить (и IMHO запутать) вы можете ссылаться на классы с псевдонимами с помощью директивы using :

// Untested, but should work
namespace MyUnreadableCode {
    using m = System.Math;
    class Foo {
        public static Int32 Absolut(Int32 a) {
            return m.Abs(a);
        }
    }
}
3 голосов
/ 20 февраля 2012

Нельзя присвоить переменной значение статического класса.Вопрос , почему вы хотите это сделать, возможно, есть другие способы решения вашей проблемы

, например, вы можете использовать делегатов для назначения операции, которую вы хотите выполнить:

Func<int,int> operation = Math.Abs; 
// then you could use it like so: 
int processedValue = operation(-1);
2 голосов
/ 07 декабря 2015

В C # 6.0 введена функция статического импорта , которая может решить эту проблему.

using static System.Math;

class MyProgram
{
    static void Main(string[] args)
    {
        var b = Abs(4); // No need to specify the name of Math class
    }
}
2 голосов
/ 20 февраля 2012

В c # они называются типами.И вы можете назначить их как:

Type a = typeof(SomeClass);

Однако вам нужно будет создать его экземпляр, чтобы использовать его.Я полагаю, что вам нужен статический импорт, как в java, но, к сожалению, они не существуют в c #.

Краткий ответ: не так, как у вас выше.

1 голос
/ 20 февраля 2012

Как я понимаю, нужно ссылаться на класс с коротким именем?попробуйте это (в верхней части файла, внутри раздела использования операторов):

using m = System.Math;

позже в вашем коде:

m.Abs(...)

Имеет смысл?

0 голосов
/ 20 февраля 2012

Нет.Невозможно трактовать Type как значение, когда методы экземпляра привязываются к статическим методам исходного типа.Чтобы сделать это, вам нужно создать новый тип, который перенаправляет вызовы методов к исходному типу.

class MyMath { 
  public int Abs(int i) {
    return Math.Abs(i);
  }
}

var x = new MyMath();
...