вы можете написать vbscript, чтобы создать экземпляр excel с помощью метода createobject (), затем откройте книгу и запустите макрос. Вы можете либо напрямую вызвать vbscript, либо вызвать vbscript из командного файла.
Вот ресурс, который я только что наткнулся: http://www.codeguru.com/forum/showthread. PHP? т = 376401
Используемый вами шаблон фактически не реализует требуемое ограничение. Предположим, вы хотите смоделировать «животное может быть только дружественным с чем-то своего рода»:
abstract class Animal<T> where T : Animal<T>
{
public abstract void GetFriendly(T t);
}
class Cat : Animal<Cat>
{
public override void GetFriendly(Cat cat) {}
}
Удалось ли нам реализовать желаемое ограничение? Нет.
class EvilDog : Animal<Cat>
{
public override void GetFriendly(Cat cat) {}
}
Теперь злая собака может быть дружелюбна с любым котом и не дружит с другими злыми собаками.
Ограничение типа, которое вы хотите, невозможно в C # система. Попробуйте Haskell, если вам нужно такое ограничение, которое применяется системой типов.
См. Мою статью по этому вопросу для более подробной информации:
http: //blogs.msdn. ком / б / ericlippert / архив / 2011/02/03 / страньше-и-curiouser.aspx
Не думаю, что вам нужно указать, где T: A.
T будет B, когда вы используете класс B: A
Это также известно как CRTP или любопытно повторяющийся шаблон шаблона и является известной идиомой.
Мой последний вопрос был отмечен как дубликат этого. Я полностью согласен с этим. Поэтому я пришел сюда, чтобы взглянуть на ответы и прочитать пост Эрика (очень интересно). Вы не можете обеспечить это во время компиляции с помощью системы типов, но вы можете сделать это во время выполнения. Способ, которым я это реализовал, это:
abstract class FooBase<T>
{
protected FooBase()
{
if (typeof(T) != GetType())
{
throw new InvalidOperationException();
}
}
}
Посредством этого мы можем посадить семя злой собаки, но эта собака будет прервана во время выполнения.
Поскольку A является абстрактным, вы можете добавить абстрактные методы в A и вызвать их из A и B, которые будут вынуждены реализовать метод, будет invoker:
abstract class A<T> where T:A
{
public event Action<T> Event1;
public abstract void Method();
public A(){Method();}
}
class B : A<B>
{
//has a field called Action<B> Event1;
public void Method(){ //stuff }
}
При создании B, конструктор базового класса вызовет метод (), который реализуется только в B, заставляя экземпляр B быть вызванным.
Это позволяет A вызывать специальные методы подкласса, не требуя, чтобы A обладало конкретными знаниями о детях. Недостатком является то, что ВСЕ дети должны внедрять метод или повторно абстрагировать его на своих собственных детей.