2012-07-04 4 views
3

Во время компиляции я не знаю, какой именно тип я передам методу, но я уверен, что этот тип будет содержать некоторое свойство. Как передать тип функции для выполнения кастинга в функции? Я хотел бы получить что-то вроде этого:Как передать класс Type функции, чтобы ее отличить от функции

foo (classType cl) 
{ 
    int x = ((cl)SomeClass).Id.Value; 
} 
+0

Какая задача вы пытаетесь решить? Вы можете использовать интерфейсы, дженерики или другие средства. Но решение зависит от того, чего вы пытаетесь достичь в этой ситуации. – Trogvar

+0

Я пытаюсь получить sth следующим образом: int id = ((cl) SomeClass) .id.Value; – Sayid

+0

Не могли бы вы подробнее рассказать? Я не думаю, что вы можете применить класс (в вашем примере SomeClass) к другому классу. Вы можете передать объект другому классу. Но вы должны знать, что это тип, который может быть перенесен на другой тип (или вы получите InvalidCastException). Вы могли бы использовать generics и ограничение для параметра type, но тогда вам не пришлось бы бросать его. Поэтому я озадачен тем, чего вы пытаетесь достичь, и в чем проблема, которую вы пытаетесь решить. – Peter

ответ

5

Другой ответ не будет работать при использовании .id, потому что ваш тип T не ограничен. Класс не имеет ни малейшего представления о том, что любая T может реализовать поле/свойство ID

Представьте, что вы использовали вместо

foo <int>() 

T будет ИНТ и ИНТ не имеет идентификатор поля/свойства

Вы можете ограничить хотя бы

foo <T>() 
    where T : ClassTypeThatImplementsId 
{ 
    int x = ((T)SomeClass).Value; 
} 

Хотя это означает, что T может быть только определенного типа. Есть ли базовый класс с идентификатором, который вы можете использовать вместо этого? Я не знаю, является ли это решение, которое вы хотите, хотя ...

Edit:

В ответ на Ваше сообщение:

foo <T>() 
    where T : BaseClass 
{ 
    int x = ((T)SomeClass).Value; 
} 

Должно работать при условии, «Value» BaseClass Реализует (и предполагая, SomeClass приходит откуда-то, как там кажется, нет никакой ссылки на него в методе)

+0

Это должен быть идентификатор или значение? –

+0

Публикация OP ** foo (classType cl) {int x = ((cl) SomeClass) .id.Value; } ** в комментарии, поэтому я принял id – Charleh

+0

Спасибо. На самом деле есть базовый класс с идентификатором. Но я хочу, чтобы получить этот идентификатор из производного класса. Могу ли я сделать это так :? ** foo () где T: BaseClass { int x = ((T) SomeClass) .x.Value; } ** T вытекает из BaseClass – Sayid

1

Update

foo <T>() : where SomeTypeHavingValue 
{ 
    int x = ((T)SomeClass).Value; 
} 
+0

Спасибо, но на самом деле это должно было быть: foo (classType cl) { int x = ((cl) SomeClass) .id.Стоимость; } и теперь я получаю ошибку, как это: Ошибки «ф» не содержит определение для «ид», а метод расширения «ид» принимающему первого аргумента типа «тп» можно найти (в вам не хватает директивы использования или ссылки на сборку?) – Sayid

+1

попробуйте импортировать пространство имен System.Collections.Generics как 'using System.Collections.Generics' –

+2

Что? Как это может работать? Как T имеет свойство .Value? 3 upvotes? : S – Peter

2

что-то, как это будет работать (если это вы пытаетесь достичь), но вам не нужно литье:

public interface IHasInteger 
{ 
    int Value { get; } 
} 

public class HasInteger : IHasInteger 
{ 
    public int Value { get { return 1; } } 
} 

public class AlsoHasInteger : IHasInteger 
{ 
    public int Value { get { return 2; } } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var a = new HasInteger(); 
     var b = new AlsoHasInteger(); 
     var c = new object(); 
     Console.WriteLine(GetInteger(a)); 
     Console.WriteLine(GetInteger(b)); 
     Console.WriteLine(GetInteger(c)); 
     Console.ReadLine(); 
    } 

    private static int GetInteger(object o) 
    { 
     if (o is IHasInteger) 
     { 
      int x = ((IHasInteger)o).Value; 
      return x; 
     } 

     return 0; 
    } 
} 
+0

Интерфейсы звучат как способ идти здесь, так как OP, похоже, хочет использовать повторно типизированное строго типизированное свойство – Charleh

Смежные вопросы