Запишите все ярлыки и функции, которые Вы используете в своем текущем редакторе при использовании его на работе. Затем сядьте в субботу утром, и Google использования и переполнение стека узнают, как сделать каждого из тех, которые в vi. Вероятно, лучше всего, если Вы используете лист (или листы) бумаги для этого.
Теперь отключают/удаляют других редакторов работы так, чтобы она взяла Вас дольше, чтобы найти и переустановить их, чем взгляд на Ваше сравнение покрывает и делает это в vi - т.е. у Вас нет выбора.
Наконец, опубликуйте свой список перекрестных ярлыков от Вашего старого редактора к Вашему новому на Вашем блоге.
Удачи!
То, что вы пытаетесь сделать, возможно следующим образом:
class TestClass<T>
{
public string GetName<T>()
{
Type typeOfT = typeof(T);
if(typeOfT == typeof(string))
{
//do string stuff
}
}
}
Хотя это возможно, вы в некотором роде побеждаете цель дженериков. Смысл дженериков в том, что тип не имеет значения , поэтому я не думаю, что дженерики подходят в этом случае.
Специализация в C # невозможна. Наиболее близким к C # является следующее
public void Example() {
public static void Method<T>(T value) { ... }
public static void Method(int value){ ... }
public static void Method(string) { ... }
}
. Компилятор C # предпочтет неуниверсальный метод универсальному методу. Это означает, что вызов с параметром int будет привязан к перегрузке int по сравнению с общей.
Example.Method(42); // Method(int)
Example.Method(new Class1()) // Method<T>(T)
Это вас укусит, потому что это не применимо, когда метод вызывается в общем случае. В этом случае он будет связываться с общей перегрузкой независимо от типа.
public void Gotcha<T>(T value) {
Example.Method(value);
}
Gotcha(42); // Still calls Example.Method<T>()
«Специализация» невозможна в C #, как в C ++. В дженериках .NET общий класс или метод >, используйте тот же машинный код языка. (разные типы значений получают отдельный машинный код, но вы по-прежнему не можете специализироваться.)
Я считаю, что иногда помогает создать общий интерфейс или базовый класс, подобный этому:
abstract class Base<T> {
public abstract T GetName();
// any common code goes here that does not require specialization
}
И выполнить специализацию в производных классах:
class IntVersion : Base<int> {
public override int GetName() { return 1; }
public int GetName(int addNumber) { ... }
}
class StringVersion : Base<string> {
public override string GetName() { return "foo"; }
}
class DateTimeVersion : Base<DateTime> {
public override DateTime GetName() { return DateTime.Now; }
}
Нет, это невозможно. То, что вы пытаетесь сделать, похоже на специализацию шаблонов в C ++, что (к сожалению) невозможно в C #.
Вам нужно if / else или включить
typeof(T)
для вызова специализированных реализаций.
Однако вы можете ограничить тип T классом (ссылочное значение), структурой (значение) или подклассом определенного базового класса, например:
public Foo<T> DoBar<T>() where T : FooBase;
C # не Нет поддержки для такой отправки.
, и это неправильный способ также выполнять перегрузку метода (Error'TestClass 'уже определяет член с именем' GetName 'с теми же типами параметров), если все внутри <> не является частью сигнатуры метода.
Подойдет ли вам использование методов расширения класса? ?
Вы можете добавлять методы к нужным классам, а затем вызывать их таким же образом.
namespace ExtensionMethods
{
public static class MyExtensions
{
public static int GetName(this String str)
{
...
}
}
}
вызывается с использованием:
myString.GetName();
Если вам нужно выполнять в классе работу с конкретным типом, то ваш класс не является универсальным. Вероятно, вам следует создать отдельный класс для каждого типа, с которым вы хотите работать. Если есть какие-то функциональные возможности, у которых есть веские причины быть универсальными, вы можете поместить их в общий базовый класс.
Пример:
abstract class TestClass<T>
{
public List<T> Items { get; set; }
// other generic (i.e. non type-specific) code
}
class IntTestClass : TestClass<int>
{
public string GetName()
{
// do work knowing that the type is an int
}
// other code specific to the int case
}
class StringTestClass : TestClass<string>
{
public string GetName()
{
// do work knowing that the type is a string
}
// other code specific to the string case
}