Я в настоящее время требую, чтобы это запустило основанное на Eclipse приложение, но я должен установить некоторые переменные сначала, который локален для того приложения. sc.exe только позволит исполняемые файлы, но не сценарии, таким образом, я обратился к autoexnt.exe, который является частью набор ресурса Windows 2003 . Это ограничивает сервис файлом единого пакета, но мне только нужен один сценарий пакетной обработки, который будет преобразован на службу.
чао!
Хотя это нормально работает, мне интересно, есть ли более элегантный или встроенный способ сделать это?
На самом деле нет встроенного способа сделать это, поскольку вы здесь как бы нарушаете основные принципы объектно-ориентированного программирования. Ваш базовый класс не должен иметь никаких знаний о подклассах в традиционной объектно-ориентированной теории.
При этом, если вы должны это сделать, ваша реализация, вероятно, будет настолько хороша, насколько вы собираетесь получить, если вы не можете добавить какую-либо другую информацию к подклассам напрямую. Если вам нужно контролировать это, и вы не можете изменять подклассы, это, вероятно, будет вашим лучшим подходом.
Это немного отличается от того, о чем вы просите, но, возможно, дает то же самое.
class Program
{
static void Main(string[] args)
{
Console.WriteLine((new B()).theValue);
Console.WriteLine((new C()).theValue);
Console.ReadKey();
}
}
public abstract class A
{
public readonly string theValue;
protected A(string s)
{
theValue = s;
}
}
public class B : A
{
public B(): base("Banana")
{
}
}
public class C : A
{
public C(): base("Coconut")
{
}
}
Существует альтернативное решение, которое может быть лучше вашего, а может и не быть, в зависимости от варианта использования :
abstract class ClassA
{
private static class InternalClass<T> {
public static string Value;
}
public string GetValue()
{
return (string)typeof(InternalClass<>)
.MakeGenericType(GetType())
.GetField("Value", BindingFlags.Public | BindingFlags.Static)
.GetValue(null);
}
}
Этот подход используется в EqualityComparer
. Конечно, для этой задачи он не используется. Вам действительно стоит подумать о том, чтобы сделать GetValue
абстрактным и переопределить его в каждом производном классе.